limosky 发表于 2019-11-9 17:37:45

两片STM8通过硬件IIC通信问题,主机匹配完地址后就卡主了

试着用IIC让两片STM8通信,一片做主机,一片做从机。主机发送地址后,就停留在发送第一个字节字符后,设备一直停在while(!I2C_GetFlagStatus(I2C_FLAG_TXEMPTY));
搞了好久没找到解决办法{:3_60:}求组。。。


主机发送信息的代码:
<blockquote>void Write2Byte(void)从机初始化IIC,设置了中断:
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
uint8_t data;
/* Read SR2 register to get I2C error */
if ((I2C->SR2) != 0)
{
    /* Clears SR2 register */
    I2C->SR2 = 0;
}
Event = I2C_GetLastEvent();
switch (Event)
{
      /******* Slave transmitter ******/
      /* check on EV1 */
    case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:
      Tx_Idx = 0;
      UART1_Printf("I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED");
      break;

      /* check on EV3 */
    case I2C_EVENT_SLAVE_BYTE_TRANSMITTING:
      /* Transmit data */
      I2C_SendData(Slave_Buffer_Rx);
      UART1_Printf("I2C_EVENT_SLAVE_BYTE_TRANSMITTING");
      break;
      /******* Slave receiver **********/
      /* check on EV1*/
    case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
      UART1_Printf("I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED");
      break;

      /* Check on EV2*/
      case I2C_EVENT_SLAVE_BYTE_RECEIVED:
      Slave_Buffer_Rx = I2C_ReceiveData();
      UART1_Printf("I2C_EVENT_SLAVE_BYTE_RECEIVED ");
      break;

      /* Check on EV4 */
    case (I2C_EVENT_SLAVE_STOP_DETECTED):
            /* write to CR2 to clear STOPF flag */
            I2C->CR2 |= I2C_CR2_ACK;
            UART1_Printf("I2C_EVENT_SLAVE_STOP_DETECTED ");
      break;

    default:
      break;
}}







mikecai 发表于 2019-11-10 09:39:38

您的 INTERRUPT_HANDLER()应该是中断处理程序吧,你在紧短的中断处理中,又是接收,还要发送,还有长长蛮速串口打印,挺忙啊,

mikecai 发表于 2019-11-10 09:44:43

建议,中断处理程要尽量短,处理标志位就可以了,实在不行,也只是缓冲接受短字节,发送处理在主loop空闲中依据标志位处理,中断不要打印。

butterflyspring 发表于 2019-11-20 14:45:17

标准外设库里有例程,跑一下试试呗:) 我们都是直接拿来用,但是注意尽量不要在中断里加那么多代码,保证中断有最高优先级:P

gonggu8181 发表于 2019-12-1 14:47:37

能用串口尽量用串口,当时用STM32多机通讯就发现还是串口简单稳定,波特率115200。现在基本都是两个串口,不够还可以端口复用

butterflyspring 发表于 2019-12-3 17:34:52

串口是异步通讯,个人认为协议简单,但是对双方时钟有一定要求。I2C是同步通讯,协议略微复杂,但是对双方时钟没有什么过多要求。而且目前很多传感器等接口采用I2C的比较普遍。 总之看应用需求了:)
页: [1]
查看完整版本: 两片STM8通过硬件IIC通信问题,主机匹配完地址后就卡主了