buyadong 发表于 2017-11-4 02:38:20

请问,硬件I2C主发送器和主接收器的转换问题

         在一个项目中遇到一个问题,项目中使用的I2C是非标准的I2C,没有地址字节,现在的折中方案是,使用要发送的数据的首字节作为地址进行发送。已经能够通讯一两包。但当首字节的第0位为1时(例如0xE3),后续字节无法发出。         研究许久,现在只有一个问题需要确认:STM32F1硬件I2C 当主发送器发送了一个最后一位为1的地址字节时,是否是硬件自动检测写到DR寄存器中的Address字节的第0位,然后自动切换成主发送器或者主接收器?如果这个过程是自动的,有其他办法解决遇到的问题吗?或者有什么其他办法能够实现硬件I2C发送任意首字节的数组吗?

         下面是我抓包的数据,显示了这个情况:
         
         程序当中,使用HAL库中的
         HAL_I2C_Master_Transmit_IT(&h_I2c, (uint16_t)i2c_cmdlist, &i2c_cmdlist, bytes - 1);

         且在HAL库的stm32f1xx_hal_i2c.c文件中的 I2C_Master_SB 函数中部分内容,如下,

/* 修改了这里,用以匹配要发送最后一个bit为1的情况 */
#ifndef USE_NO_ADDR_ADJ
   /* Send slave 7 Bits address */
    if(hi2c->State == HAL_I2C_STATE_BUSY_TX)
   {
       hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
   }
   else
   {
      hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
   }
#else
   hi2c->Instance->DR = hi2c->Devaddress;
#endif

buyadong 发表于 2017-11-4 20:00:52

有人研究过吗?

wenyangzeng 发表于 2017-11-28 09:31:02

建议你每发送1个字节后就发送停止位。

无薪税绵 发表于 2017-11-28 11:38:18

它的地址码,会不会是0xFF?
页: [1]
查看完整版本: 请问,硬件I2C主发送器和主接收器的转换问题