8G1K08-36I-SOP8 I2C 读写外设slave 设备 失败问题
本帖最后由 DebugLab 于 2024-9-4 11:05 编辑请教一下,目前使用8G-STC8H-LIB-DEMO-CODE-20240429独立程序 里的 “18-I2C主机模式访问AT24C02程序” 做基础,修改为 访问其他I2C slave设备,
修改了 I2C 地址,也修改的对应的 端口号,但是运行程序的时候,卡在I2C_ReadNbyte 函数,不能往下进行! I2C使用的是 MCU 的 第 7 和 第 8脚位(P3.2 和 P3.3)
I2C_config 里面也选用了这两个脚位 I2C_SW(I2C_P33_P32); 大概是什么问题导致 主程序不能执行下去!
8G1K08A硬件I2C测试正常:
#define SCL P32
#define SDA P33
bit I2C_Busy;
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);
}
void Init(void)
{
P_SW2|=EAXFR;
P3M0=0x00;
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
P3PU=0x0c;
I2CCFG=0xC1; //921.6K@11.0592M
I2CMSCR=EMSI;
I2CMSST=0x00;
EA=1;
}
void I2C_Isr(void) interrupt 24
{
if(I2CMSST&MSIF)
{
I2CMSST&=~MSIF;
I2C_Busy=0;
}
}
你的其它IIC设备是啥呢?它的协议是否支持I2C_ReadNbyte这个行为? 硬件i2c没有使能会卡的 初始化i2c后,打印i2c的寄存器看有没有正确写入初始化数据 请问P3.2 和 P3.3的IO口模式初始化了吗?
默认是高阻输入,没有初始化不能通信。 附图是我的代码,应该是初始化过了吧 再查一下你修改过的程序,看看有没有哪些地方修改了P_SW2寄存器,例如调用EAXRAM,误关闭了扩展寄存器访问使能。
I2C寄存器基本上都是扩展寄存器,如果关闭了扩展寄存器访问使能,就会导致无法正常读写I2C寄存器。
整个project,只有定义 EAXRAM, 没有其他地方调用!
本帖最后由 兴睿康-林生 于 2024-9-5 22:28 编辑
现在是要用MCU I2C主模式,访问,读写 外部其他芯片的I2C 寄存器,不是读写MCU 寄存器哦
是不是I2C_ReadNbyte 这个函数,只能读取eeprom ,连续N个 data, 不能读取其他芯片 寄存器,先写寄存器地址,后读取data?
页:
[1]
2