你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
limosky 提问时间:2019-11-9 17:37 /
试着用IIC让两片STM8通信,一片做主机,一片做从机。主机发送地址后,就停留在发送第一个字节字符后,设备一直停在while(!I2C_GetFlagStatus(I2C_FLAG_TXEMPTY));
搞了好久没找到解决办法求组。。。


主机发送信息的代码:
  1. <blockquote>void Write2Byte(void)
复制代码
从机初始化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.   }}
复制代码








收藏 评论5 发布时间:2019-11-9 17:37

举报

5个回答
慎微 回答时间:2019-11-10 09:39:38
您的 INTERRUPT_HANDLER()应该是中断处理程序吧,你在紧短的中断处理中,又是接收,还要发送,还有长长蛮速串口打印,挺忙啊,
慎微 回答时间:2019-11-10 09:44:43
建议,中断处理程要尽量短,处理标志位就可以了,实在不行,也只是缓冲接受短字节,发送处理在主loop空闲中依据标志位处理,中断不要打印。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

butterflyspring 回答时间:2019-11-20 14:45:17
标准外设库里有例程,跑一下试试呗 我们都是直接拿来用,但是注意尽量不要在中断里加那么多代码,保证中断有最高优先级

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

gonggu8181 回答时间:2019-12-1 14:47:37
能用串口尽量用串口,当时用STM32多机通讯就发现还是串口简单稳定,波特率115200。现在基本都是两个串口,不够还可以端口复用

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

butterflyspring 回答时间:2019-12-3 17:34:52
串口是异步通讯,个人认为协议简单,但是对双方时钟有一定要求。I2C是同步通讯,协议略微复杂,但是对双方时钟没有什么过多要求。而且目前很多传感器等接口采用I2C的比较普遍。 总之看应用需求了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版