求助,两片STM8 I2C通信问题,主机匹配地址后发数据卡住

2019-12-09 19:20发布

本帖最后由 Deiki 于 2019-11-9 18:20 编辑

试着用IIC让两片STM8通信,一片做主机,一片做从机。主机发送地址后,就停留在发送第一个字节字符后,设备一直停在while(!I2C_GetFlagStatus(I2C_FLAG_TXEMPTY));
从机有地址匹配的中断产生,但是没有接受到数据。

主机初始化后,写数据
  1. void Write2Byte(void)
  2. {

  3.   I2C_GenerateSTART(ENABLE);
  4.   while(!I2C_GetFlagStatus(I2C_FLAG_STARTDETECTION));
  5.   I2C_Send7bitAddress(0xB0, I2C_DIRECTION_TX);
  6.   while(!I2C_GetFlagStatus(I2C_FLAG_ADDRESSSENTMATCHED));
  7.   I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);// must add
  8.   I2C_SendData(0x00);
  9.   while(!I2C_GetFlagStatus(I2C_FLAG_TXEMPTY));
  10.   I2C_SendData(0x10);
  11.   while(!I2C_GetFlagStatus(I2C_FLAG_TXEMPTY));
  12.   I2C_SendData(0x20);
  13.   while(!I2C_GetFlagStatus(I2C_FLAG_TRANSFERFINISHED));
  14.   I2C_GenerateSTOP(ENABLE);
  15. }
复制代码

从机初始化IIC,设置了中断:可以进入地址匹配的中断。但没有接受到数据
  1. INTERRUPT_HANDLER(I2C_IRQHandler, 19)
  2. {
  3.   uint8_t data;
  4.   /* Read SR2 register to get I2C error */
  5.   if ((I2C->SR2) != 0)
  6.   {
  7.     /* Clears SR2 register */
  8.     I2C->SR2 = 0;
  9.   }
  10.   Event = I2C_GetLastEvent();
  11.   switch (Event)
  12.   {
  13.       /******* Slave transmitter ******/
  14.       /* check on EV1 */
  15.     case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:
  16.       Tx_Idx = 0;
  17.       UART1_Printf("I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED");
  18.       break;

  19.       /* check on EV3 */
  20.     case I2C_EVENT_SLAVE_BYTE_TRANSMITTING:
  21.       /* Transmit data */
  22.       I2C_SendData(Slave_Buffer_Rx[Tx_Idx++]);
  23.       UART1_Printf("I2C_EVENT_SLAVE_BYTE_TRANSMITTING");
  24.       break;
  25.       /******* Slave receiver **********/
  26.       /* check on EV1*/
  27.     case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
  28.       UART1_Printf("I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED");
  29.       break;

  30.       /* Check on EV2*/
  31.       case I2C_EVENT_SLAVE_BYTE_RECEIVED:
  32.       Slave_Buffer_Rx[Rx_Idx++] = I2C_ReceiveData();
  33.       UART1_Printf("I2C_EVENT_SLAVE_BYTE_RECEIVED ");
  34.       break;

  35.       /* Check on EV4 */
  36.     case (I2C_EVENT_SLAVE_STOP_DETECTED):
  37.             /* write to CR2 to clear STOPF flag */
  38.             I2C->CR2 |= I2C_CR2_ACK;
  39.             UART1_Printf("I2C_EVENT_SLAVE_STOP_DETECTED ");
  40.       break;

  41.     default:
  42.       break;
  43.   }}
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。