[技术问答] I2C硬件收发器的状态字节是不是有统一的标准啊

[复制链接]
1362|2
 楼主| wahahaheihei 发表于 2024-6-15 21:07 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*  I2C Rx Callback Function                                                                               */
  3. /*---------------------------------------------------------------------------------------------------------*/
  4. void I2C_MasterRx(uint32_t u32Status)
  5. {
  6.     if (u32Status == 0x08)                      /* START has been transmitted and prepare SLA+W */
  7.     {
  8.         I2C_SET_DATA(I2C0, (g_u8DeviceAddr << 1)); /* Write SLA+W to Register I2CDAT */
  9.         I2C_SET_CONTROL_REG(I2C0, I2C_SI);
  10.     }
  11.     else if (u32Status == 0x18)                 /* SLA+W has been transmitted and ACK has been received */
  12.     {
  13.         I2C_SET_DATA(I2C0, g_au8TxData[g_u8DataLen++]);
  14.         I2C_SET_CONTROL_REG(I2C0, I2C_SI);
  15.     }
  16.     else if (u32Status == 0x20)                 /* SLA+W has been transmitted and NACK has been received */
  17.     {
  18.         I2C_SET_CONTROL_REG(I2C0, I2C_STA | I2C_STO | I2C_SI);
  19.     }
  20.     else if (u32Status == 0x28)                 /* DATA has been transmitted and ACK has been received */
  21.     {
  22.         if (g_u8DataLen != 2)
  23.         {
  24.             I2C_SET_DATA(I2C0, g_au8TxData[g_u8DataLen++]);
  25.             I2C_SET_CONTROL_REG(I2C0, I2C_SI);
  26.         }
  27.         else
  28.         {
  29.             I2C_SET_CONTROL_REG(I2C0, I2C_STA | I2C_SI);
  30.         }
  31.     }
  32.     else if (u32Status == 0x10)                 /* Repeat START has been transmitted and prepare SLA+R */
  33.     {
  34.         I2C_SET_DATA(I2C0, (g_u8DeviceAddr << 1) | 0x01);  /* Write SLA+R to Register I2CDAT */
  35.         I2C_SET_CONTROL_REG(I2C0, I2C_SI);
  36.     }
  37.     else if (u32Status == 0x40)                 /* SLA+R has been transmitted and ACK has been received */
  38.     {
  39.         I2C_SET_CONTROL_REG(I2C0, I2C_SI);
  40.     }
  41.     else if (u32Status == 0x58)                 /* DATA has been received and NACK has been returned */
  42.     {
  43.         g_u8RxData = I2C_GET_DATA(I2C0);
  44.         I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
  45.         g_u8EndFlag = 1;
  46.     }
  47.     else
  48.     {
  49.         /* TO DO */
  50.         printf("Status 0x%x is NOT processed\n", u32Status);
  51.     }
  52. }

  53. /*---------------------------------------------------------------------------------------------------------*/
  54. /*  I2C Tx Callback Function                                                                               */
  55. /*---------------------------------------------------------------------------------------------------------*/
  56. void I2C_MasterTx(uint32_t u32Status)
  57. {
  58.     if (u32Status == 0x08)                      /* START has been transmitted */
  59.     {
  60.         I2C_SET_DATA(I2C0, g_u8DeviceAddr << 1);  /* Write SLA+W to Register I2CDAT */
  61.         I2C_SET_CONTROL_REG(I2C0, I2C_SI);
  62.     }
  63.     else if (u32Status == 0x18)                 /* SLA+W has been transmitted and ACK has been received */
  64.     {
  65.         I2C_SET_DATA(I2C0, g_au8TxData[g_u8DataLen++]);
  66.         I2C_SET_CONTROL_REG(I2C0, I2C_SI);
  67.     }
  68.     else if (u32Status == 0x20)                 /* SLA+W has been transmitted and NACK has been received */
  69.     {
  70.         I2C_SET_CONTROL_REG(I2C0, I2C_STA | I2C_STO | I2C_SI);
  71.     }
  72.     else if (u32Status == 0x28)                 /* DATA has been transmitted and ACK has been received */
  73.     {
  74.         if (g_u8DataLen != 3)
  75.         {
  76.             I2C_SET_DATA(I2C0, g_au8TxData[g_u8DataLen++]);
  77.             I2C_SET_CONTROL_REG(I2C0, I2C_SI);
  78.         }
  79.         else
  80.         {
  81.             I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
  82.             g_u8EndFlag = 1;
  83.         }
  84.     }
  85.     else
  86.     {
  87.         /* TO DO */
  88.         printf("Status 0x%x is NOT processed\n", u32Status);
  89.     }
  90. }
例子中用到的这些状态,我在其他厂家单片机里看到的也是这几个,对应的含义状态也一样。
 楼主| wahahaheihei 发表于 2024-6-15 21:29 | 显示全部楼层
29474666d97321b246.png
手册总结的挺全面的
 楼主| wahahaheihei 发表于 2024-6-15 21:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

234

主题

3227

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部