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;
}
}
我这样的读出来也全是FF,求助,不知道该咋改了
页:
1
[2]