標題:
CH32V103單片機硬件IIC加載兩個IIC外設 源程序
[打印本頁]
作者:
隨緣57
時間:
2022-4-19 08:22
標題:
CH32V103單片機硬件IIC加載兩個IIC外設 源程序
這里提供了CH32V103R8T6核心板I2C1同時加載DS3231和IIC接口0.91吋OLED的程序代碼,讀取DS3231的時間數據,然后顯示在OLED上。
源程序如下:
/*
*@Note
用途:使用I2C1驅動SSD1306主控、i2c接口的0.91吋或0.96吋OLED。
如果使用I2C2,需要將SSet_IIC()和ssd1306.h中的OLED_WriteByte()函數中的I2C1改為I2C2
并且將Set_IIC()中的 GPIO_Pin_6 | GPIO_Pin_7 改為 GPIO_Pin_10 | GPIO_Pin_11
*/
#include "codeTab.h"
#include "ssd1306_i2c.h"
#include "debug.h"
/* Global typedef */
/* Global define */
/* Global Variable */
u16 i; //計數用變量
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-PB10,SDA-PB11
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);
}
/************* @以上為i2c設置及數據發(fā)送函數 ****************/
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;
}
/************* @以上為DS3231相關函數 ****************/
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);
OLED_Init(); //OLED初始化
OLED_Fill(0xff); //滿屏點亮,提示OLED能夠工作
Delay_Ms(500);
OLED_Fill(0x00); //清屏
OLED_ShowStr(0, 0, "I2C1-DS3231-OLED", 2);
OLED_ShowSZ(0, 32, 2, 2);
OLED_ShowSZ(0, 40, 2, 2);
OLED_ShowStr(48, 3, ":",1);
OLED_ShowSZ(0, 56, 2, 2);
OLED_ShowSZ(0, 64, 2, 2);
OLED_ShowStr(72, 3, ":",1);
OLED_ShowSZ(0, 80, 2, 2);
OLED_ShowSZ(0, 88, 2, 2);
u8 tt=0;
u8 aa=0;
u8 bb=0;
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);
aa=tt/10;
bb=tt-aa*10;
OLED_ShowSZ(aa, 32, 2, 2);
OLED_ShowSZ(bb, 40, 2, 2);
tt=BCD2HEX(DS3231_ByteRead(0x01));
//printf(" min:%d\n",tt);
aa=tt/10;
bb=tt-aa*10;
OLED_ShowSZ(aa, 56, 2, 2);
OLED_ShowSZ(bb, 64, 2, 2);
tt=BCD2HEX(DS3231_ByteRead(0x00));
//printf(" sec:%d\n",tt);
//printf(" ********* %d\n");
aa=tt/10;
bb=tt-aa*10;
OLED_ShowSZ(aa, 80, 2, 2);
OLED_ShowSZ(bb, 88, 2, 2);
Delay_Ms(995);
}
}
復制代碼
MounRiver_Studio代碼工程下載:51hei附件下載:
test.7z
(338.32 KB, 下載次數: 16)
2022-4-19 16:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
水裳念
時間:
2022-5-24 07:41
可以,我覺得不錯
作者:
simba1234
時間:
2022-8-29 16:40
樓主用CH32V用的挺嗨啊 我還沒嘗試這個
作者:
滑動的憨憨
時間:
2023-5-2 18:16
CH32V用起來怎么樣啊,沒用過
作者:
滑動的憨憨
時間:
2023-9-24 20:41
CH32V103做項目和STM32F103相比如何
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1