本帖最后由 muzierli 于 2023-8-25 14:24 编辑
8.25今天修改代码,意外读取到按键接口的数据,原因待分析,静待更新,心情好转,把握机会查代码去了。另外说明下硬件设计,这是一个I2C0模块用在两组IO端口上(PB6,7和PB8,9),因为用了两片AW9523,这个芯片的地址配置决定IO口的复位状态,所以由于地址配置重复的问题,分开两个线路做的,有一组平时基本不用,就是初始化和有需要时用于配置串口工作模式的,所以存在端口切换的问题。读取代码没有问题,问题应该还是在配置上,最终问题找到了,原因是端口配置,没有释放原端口与I2C模块的链接,读取到的数据是两个端口信号竞争的结果,写因为是输出没发现问题,但实际上也应该对另一片进行了操作,还要检查下,否则两片扩展芯片的数据就会乱。从这次问题来看说明只要你愿意,一个AF模块可以挂到好几个端口上,在功能不冲突的条件下可以做多路输入或输出,无时差。此问题完结。
8.24的内容如下:
硬件I2C,读取爱华AW9523灯+IO扩展,读的数总是0x00,测量波形应该是0xFF,读流程能走完就是取到的数不对,写数据正常,有没遇到类似问题的。
读代码如下:
unsigned char i2c0read(unsigned char slaveAddr, unsigned char addr)
{
unsigned char data;
/* wait until I2C bus is idle */
while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
/* send a start condition to I2C bus */
i2c_start_on_bus(I2C0);
/* wait until SBSEND bit is set */
while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
/* send slave address to I2C bus */
i2c_master_addressing(I2C0, slaveAddr, I2C_TRANSMITTER);
/* wait until ADDSEND bit is set */
while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
/* clear ADDSEND bit */
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
/* wait until the transmit data buffer is empty */
while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
/* register address transmission */
i2c_data_transmit(I2C0, addr);
/* wait until the TBE bit is set */
while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
/* send a restart condition to I2C bus */
i2c_start_on_bus(I2C0);
/* wait until SBSEND bit is set */
while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
/* send slave address to I2C bus */
i2c_master_addressing(I2C0, slaveAddr, I2C_RECEIVER);
/* wait until ADDSEND bit is set */
while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
/* N=1,reset ACKEN bit before clearing ADDRSEND bit */
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
/* clear ADDSEND bit */
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
/* wait until the RBNE bit is set */
while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE));
/* read a data from I2C_DATA */
data = i2c_data_receive(I2C0);
/* send a stop condition to I2C bus */
i2c_stop_on_bus(I2C0);
/* wait until stop condition generate */
while(I2C_CTL0(I2C0) & I2C_CTL0_STOP);
/* enable acknowledge */
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
return data;
}
|