标题:
CH32V103读取DS3231源程序
[打印本页]
作者:
随缘57
时间:
2022-4-18 19:57
标题:
CH32V103读取DS3231源程序
CH32V103提供了两组硬件IIC,经过一段时间探索觉得比较好用。这里提供了使用I2C1读写DS3231的例程代码,利用printf()函数在串口助手中显示读取的DS3231日期时间数据。例程在MounRiver开发环境下调试通过,上传供交流。
单片机源程序如下:
/*
*@Note
串口打印调试例程:
USART1_Tx(PA9)。
本例程演示硬件I2C1读写DS3231。
*/
#include "debug.h"
/* Global typedef */
/* Global define */
/* Global Variable */
/*********************************************************************/
void Set_IIC(void) //选择I2C1
{
I2C_InitTypeDef I2C_InitStructure; //声明i2c
GPIO_InitTypeDef GPIO_InitStructure; //声明GPIO
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); //打开i2c1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //打开GPIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //i2c1引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO端口输出速率
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须复用开漏输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIO端口B,SCL-PB6,SDA-PB7
I2C_DeInit(I2C1); //外设寄存器配置为默认
I2C_AcknowledgeConfig(I2C1,ENABLE);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x30;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_Cmd(I2C1, ENABLE);
I2C_Init(I2C1, &I2C_InitStructure);
}
void DS3231_ByteWrite(u8 addr, u8 data)
{
I2C_AcknowledgeConfig(I2C1,ENABLE);
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,0xD1,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1,addr);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_SendData(I2C1,data);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1,ENABLE);
}
u8 DS3231_ByteRead(u8 nAddr)
{
I2C_AcknowledgeConfig(I2C1,ENABLE);
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)){;}
I2C_Send7bitAddress(I2C1,0xD0,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){;}
I2C_SendData(I2C1,nAddr);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)){;}
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)){;}
I2C_Send7bitAddress(I2C1,0xD1,I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){;}
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)){;}
return I2C_ReceiveData(I2C1);
}
u8 BCD2HEX(u8 val) //BCD转换为Byte
{
u8 i;
i= val&0x0f;
val >>= 4;
val &= 0x0f;
val *= 10;
i += val;
return i;
}
u16 B_BCD(u8 val)//B码转换为BCD码
{
u8 i,j,k;
i=val/10;
j=val%10;
k=j+(i<<4);
return k;
}
u8 tt=0;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
printf("****************\r\n");
printf("This is DS3231 example\r\n");
Set_IIC();
printf("Set IIC OK!\r\n");
Delay_Ms(3000);
//修改日期时间,只用一次
//tt=B_BCD(22);
//DS3231_ByteWrite(0x06, tt);//修改年
//tt=B_BCD(4);
//DS3231_ByteWrite(0x05, tt);//修改月
//tt=B_BCD(18);
//DS3231_ByteWrite(0x04, tt);//修改日
//tt=B_BCD(16);
//DS3231_ByteWrite(0x02, tt);//修改时
//tt=B_BCD(30);
//DS3231_ByteWrite(0x01, tt);//修改分
//tt=B_BCD(0);
//DS3231_ByteWrite(0x00, tt);//修改秒
while(1)
{
printf("********* \r\n");
tt=BCD2HEX(DS3231_ByteRead(0x06));
printf(" year:%d\n",tt);
tt=BCD2HEX(DS3231_ByteRead(0x05));
printf(" month:%d\n",tt);
tt=BCD2HEX(DS3231_ByteRead(0x04));
printf(" day:%d\n",tt);
tt=BCD2HEX(DS3231_ByteRead(0x02));
printf(" hour:%d\n",tt);
tt=BCD2HEX(DS3231_ByteRead(0x01));
printf(" min:%d\n",tt);
tt=BCD2HEX(DS3231_ByteRead(0x00));
printf(" sec:%d\n",tt);
printf(" ********* %d\n");
Delay_Ms(995);
}
}
复制代码
MounRiver_Studio代码工程下载:
DS3231-I2C1.7z
(126.57 KB, 下载次数: 5)
2022-4-19 01:03 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1