我没有使用过24C32,9楼网友处理好了可以参考一下:
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=181&pid=151183
论坛搜索“24C”,发现有网友提到从24C32开始是双字节寻址,这与24C02不同,需要注意:
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=7941&pid=74268
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=7941&pid=74388
具体请查看24C32数据手册,以下是立创商城找到的中文数据手册,不同品牌的24C32都是兼容的:
https://item.szlcsc.com/datasheet/AD24C32/5722225.html?spm=sc.gb.xds.a___sc.gb.hd.ss&lcsc_vid=T1deU1YFRllYXlZeFQBaVlIAEwILUFZRQgJXVQdfFlcxVlNSRlZbV1dUQ1RYUTsOAxUeFF5JWBYZEEoVDQ0NFAdIFA4DSA%3D%3D
https://item.szlcsc.com/datasheet/24C32(LX)/24007534.html?spm=sc.gb.xds.a___sc.gb.hd.ss&lcsc_vid=T1deU1YFRllYXlZeFQBaVlIAEwILUFZRQgJXVQdfFlcxVlNSRlZbV1dUQ1RYUTsOAxUeFF5JWBYZEEoVDQ0NFAdIFA4DSA%3D%3D
以下是硬件I2C参考程序:
宏定义:
- #define MSIF 0x40
- #define EMSI 0x80
- #define MSACKI 0x02
-
- bit I2C_Busy;
复制代码
I2C函数:
- void I2C_Start(void)
- {
- I2C_Busy=1;
- I2CMSCR=0x81;
- while(I2C_Busy);
- }
-
- void I2C_SendData(unsigned char dat)
- {
- I2CTXD=dat;
- I2C_Busy=1;
- I2CMSCR=0x82;
- while(I2C_Busy);
- }
-
- void I2C_RecvACK(void)
- {
- I2C_Busy=1;
- I2CMSCR=0x83;
- while(I2C_Busy);
- }
-
- unsigned char I2C_RecvData(void)
- {
- I2C_Busy=1;
- I2CMSCR=0x84;
- while(I2C_Busy);
- return I2CRXD;
- }
-
- void I2C_SendACK(void)
- {
- I2CMSST=0x00;
- I2C_Busy=1;
- I2CMSCR=0x85;
- while(I2C_Busy);
- }
-
- void I2C_SendNAK(void)
- {
- I2CMSST=0x01;
- I2C_Busy=1;
- I2CMSCR=0x85;
- while(I2C_Busy);
- }
-
- void I2C_Stop(void)
- {
- I2C_Busy=1;
- I2CMSCR=0x86;
- while(I2C_Busy);
- }
复制代码
初始化(注意先打开EAXFR并设置IO模式):
- //I2C设置
- I2CCFG=0xD7; //400K@40M
- I2CPSCR=0x00; //400K@40M
- I2CMSCR=EMSI; //允许主机模式中断,主机命令为待机
- I2CMSST=0x00; //清除中断标志
-
- //中断设置
- EA=1;
复制代码
中断:
- void I2C_Isr(void) interrupt I2C_VECTOR
- {
- if(I2CMSST&MSIF)
- {
- I2CMSST&=~MSIF;
- I2C_Busy=0;
- }
- }
复制代码
|