stm8 模拟i2c
我用stm8s105k4的IO模拟i2c协议,与MS9282通信。stm8是主机,MS9282是从机。主机对从机读,能够从MS9282的寄存器读到数据,但是却不能对MS9282写数据,求大神指点。
另附代码:
void Write_16(ui addr,ui reg,ui data)
{
uc reg_h,reg_l,data_h,data_l;
I2C_Start();
I2C_Write(addr);
if(I2C_GetAck())
{
I2C_Stop();
}
reg_l=reg&0xff;
I2C_Write(reg_l);
if(I2C_GetAck())
{
I2C_Stop();
}
reg_h=reg>>8;
I2C_Write(reg_h);
if(I2C_GetAck())
{
I2C_Stop();
}
I2C_Start();
I2C_Write(addr);
if(I2C_GetAck())
{
I2C_Stop();
}
data_l=data&0xff;
I2C_Write(data_l);
if(I2C_GetAck())
{
I2C_Stop();
}
data_h=data>>8;
I2C_Write(data_h);
if(I2C_GetAck())
{
I2C_Stop();
}
I2C_Stop();
}
ui Read_16(ui addr,ui reg)
{
ui dat;
uc reg_h,reg_l,data_h,data_l;
I2C_Start();
I2C_Write(addr);
if(I2C_GetAck())
{
I2C_Stop();
}
reg_l=reg&0xff;
I2C_Write(reg_l);
if(I2C_GetAck())
{
I2C_Stop();
}
reg_h=reg>>8;
I2C_Write(reg_h);
if(I2C_GetAck())
{
I2C_Stop();
}
I2C_Start();
I2C_Write(addr |=0x01);
if(I2C_GetAck())
{
I2C_Stop();
}
data_l=I2C_Read();
I2C_PutAck(0);
data_h=I2C_Read();
I2C_PutAck(1);
I2C_Stop();
dat=(data_h<<8)|data_l;
return dat;
}
没用过:) 没用过,帮顶~不过,stm8自己没有I2C吗? stm8有自己的I2C。。。不过写的应该没问题 能用模拟的。估计你写的时序不对。 回复各位:stm8有i2c,不过我板子上的单片机的i2c坏了,所以才采用模拟的。
我模拟的时序在同一块板子上能够对EEPROM进行读写(EEPROM是8位寄存器),而这个MS9282是16位寄存器,就是这点区别。 那你可以上传一下9282的PDF我们才能看下你IIC是否正确
页:
[1]