
我用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; } |
我模拟的时序在同一块板子上能够对EEPROM进行读写(EEPROM是8位寄存器),而这个MS9282是16位寄存器,就是这点区别。