两片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;
}}
您的 INTERRUPT_HANDLER()应该是中断处理程序吧,你在紧短的中断处理中,又是接收,还要发送,还有长长蛮速串口打印,挺忙啊,
建议,中断处理程要尽量短,处理标志位就可以了,实在不行,也只是缓冲接受短字节,发送处理在主loop空闲中依据标志位处理,中断不要打印。 标准外设库里有例程,跑一下试试呗:) 我们都是直接拿来用,但是注意尽量不要在中断里加那么多代码,保证中断有最高优先级:P 能用串口尽量用串口,当时用STM32多机通讯就发现还是串口简单稳定,波特率115200。现在基本都是两个串口,不够还可以端口复用 串口是异步通讯,个人认为协议简单,但是对双方时钟有一定要求。I2C是同步通讯,协议略微复杂,但是对双方时钟没有什么过多要求。而且目前很多传感器等接口采用I2C的比较普遍。 总之看应用需求了:)
页:
[1]