采用STM8S003F硬件I2C进行双机通讯,两个片子都使用内部16M,从机采用中断方式进行接收和发送数据(官方DEMO),主机是调用库函数向从机传数据。在主机里第一步就是检测总线是否忙,结果一直处于总线忙状态,从机也没有进入中断,硬件检查没接错线,是什么原因呢?
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)) ; // 等待总线释放 主机卡在这一直总线忙,从机进不了中断
从机初始化:
void main(void)
{
Init_Clk();
Init_IO();
Init_Timer();
Init_I2C();
enableInterrupts();
while(1)
{;
}
}
void Init_Clk(void)
{
// CLK_DeInit();
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
CLK_HSICmd(ENABLE); // 内部时钟默认8分频
// CLK_HSECmd(ENABLE);
}
void Init_I2C(void)
{
I2C_DeInit();
I2C_Init(I2C_FREQUENCY, SLAVE_ADDRESS, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
I2C_ITConfig( (I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);
I2C_Cmd(ENABLE);
}
中断:
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
if ((I2C->SR2) != 0) // 读I2C错误,清状态位。
{
I2C->SR2 = 0;
state1 = I2C_SR1;
state2 = I2C_SR3;
I2C_CR2 |= 0x04;
LedStatus(1); // Test
}
WORD Event = I2C_GetLastEvent();
switch (Event)
{
/******* Slave transmitter ******/
/* check on EV1 */
case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:
Tx_Idx = 0;
break;
/* check on EV3 */
case I2C_EVENT_SLAVE_BYTE_TRANSMITTING:
/* Transmit data */
I2C_SendData(Slave_Buffer_Rx[Tx_Idx++]);
break;
/******* Slave receiver **********/
/* check on EV1*/
case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: // 清接受地址
// Rx_Idx = 0;
I2C->SR1;
I2C->SR3;
break;
/* Check on EV2*/
case I2C_EVENT_SLAVE_BYTE_RECEIVED:
Slave_Buffer_Rx[Rx_Idx] = I2C_ReceiveData();
break;
/* Check on EV4 */
case (I2C_EVENT_SLAVE_STOP_DETECTED):
/* write to CR2 to clear STOPF flag */
I2C->SR1;
I2C->CR2 |= I2C_CR2_ACK;
break;
default:
break;
}
}
主机:
void main(void)
{
Init_Clk();
Init_IO();
Init_Timer();
Init_I2C();
enableInterrupts();
IIC_WriteByte(SLAVE_ADDRESS, DATA_ADDRESS,TestDataIIC);
while (1)
{
Test();
}
}
void Init_Clk(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
CLK_HSICmd(ENABLE);
}
void Init_I2C(void)
{
I2C_DeInit();
I2C_Init(I2C_FREQUENCY, SLAVE_ADDRESS, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
I2C_ITConfig( (I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF), DISABLE); //禁用中断
I2C_Cmd(ENABLE);
}
void IIC_WriteByte(BYTE bDevice_ID, BYTE bwrite_Data_address, BYTE bData)
{
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)) ; // 等待总线释放 主机卡在这一直总线忙,从机进不了中断
I2C_GenerateSTART(ENABLE); // 开始信号
while( !I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)) ; // 等待应答 EV5
I2C_Send7bitAddress(bDevice_ID, I2C_DIRECTION_TX); // 写选择芯片地址
while( !I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) ; // 等待应答 EV6
I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
I2C_SendData(bwrite_Data_address); // 写芯片起始地址
while( !I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING) ) ;// 等待应答 EV8
I2C_SendData(bData); // 写数据
while( !I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED) ) ; // 等待应答 EV8_2
I2C_GenerateSTOP(ENABLE); // 停止信号
|