|
CH32V103提供了兩組硬件IIC,經(jīng)過(guò)一段時(shí)間探索覺(jué)得比較好用。這里提供了使用I2C1讀寫(xiě)DS3231的例程代碼,利用printf()函數(shù)在串口助手中顯示讀取的DS3231日期時(shí)間數(shù)據(jù)。例程在MounRiver開(kāi)發(fā)環(huán)境下調(diào)試通過(guò),上傳供交流。
單片機(jī)源程序如下:
- /*
- *@Note
- 串口打印調(diào)試?yán)蹋?br />
- USART1_Tx(PA9)。
- 本例程演示硬件I2C1讀寫(xiě)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); //打開(kāi)i2c1時(shí)鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //打開(kāi)GPIO時(shí)鐘
- 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必須復(fù)用開(kāi)漏輸出
- GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIO端口B,SCL-PB6,SDA-PB7
- I2C_DeInit(I2C1); //外設(shè)寄存器配置為默認(rèn)
- 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轉(zhuǎn)換為Byte
- {
- u8 i;
- i= val&0x0f;
- val >>= 4;
- val &= 0x0f;
- val *= 10;
- i += val;
- return i;
- }
- u16 B_BCD(u8 val)//B碼轉(zhuǎn)換為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);
- //修改日期時(shí)間,只用一次
- //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);//修改時(shí)
- //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);
- }
- }
復(fù)制代碼
MounRiver_Studio代碼工程下載:
DS3231-I2C1.7z
(126.57 KB, 下載次數(shù): 5)
2022-4-19 01:03 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|