网上都说STM8的硬件I2C 不好用 有BUG之类的。而我因为项目需要,用stm8硬件 I2C 中断方式 发送/接收数据,经过查阅手册和反复验证,已经完成了,话不多说,上代码。主机主函数:I2C_MASTERMODE_Init(STANDARDSPEED);
I2C_ITConfig(I2C_IT_ERR|I2C_IT_EVT|I2C_IT_BUF,ENABLE);
rim();
delay_ms(6000);
// while (I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
// I2C_GenerateSTART(ENABLE);
while(1)
{
//I2C_Write(0x40,0x50,0x64);
//I2C_EEPROM_WriteOneByte(0x42,Cnt);
//I2C_Write(0x40,Cnt,0x58);
// Cnt++;
while (I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
I2C_ITConfig(I2C_IT_ERR|I2C_IT_EVT|I2C_IT_BUF,ENABLE);
I2C_AcknowledgeConfig(I2C_ACK_CURR);
I2C_TXCnt=0;
I2C_RXCnt=0;
I2C_GenerateSTART(ENABLE);
delay_ms(3000);
}
主机中断部分:
unsigned char Nuse;
unsigned char Event;
Event=I2C->SR1; //数据无错位
Nuse=I2C->SR3;
if(I2C_TX) //主发送
{
switch(Event)
{
case 0X01: //起始条件已经发送
I2C_Send7bitAddress(SLAVE_ADDRESS, I2C_DIRECTION_TX); //发送从机地址
break;
case 0x80: //发送区空
I2C->DR=I2C_TXBuffer[I2C_TXCnt++];
if(I2C_TXCnt>=14)
{
I2C_TXCnt=0;
I2C_ITConfig(I2C_IT_BUF, DISABLE);
}
break;
case 0X82: // 地址发送结束
// Nuse=I2C->SR3;
I2C_TXCnt=0;
I2C->DR=I2C_TXBuffer[I2C_TXCnt++];
break;
case 0x84:
I2C_GenerateSTOP(ENABLE);
I2C_ITConfig(I2C_IT_EVT, DISABLE); //不能少
break;
default:
break;
}
}
else //主接收
{
switch(Event)
{
case 0X01: //起始条件已经发送
I2C_Send7bitAddress(SLAVE_ADDRESS, I2C_DIRECTION_RX); //发送从机地址
break;
case 0x40: //接收区满
I2C_RXBuffer[I2C_RXCnt++]=I2C->DR;
if(I2C_RXCnt==13)
{
I2C_AcknowledgeConfig(I2C_ACK_NONE);
I2C_GenerateSTOP(ENABLE);
}
if(I2C_RXCnt>=14)
{
I2C_RXCnt=0;
}
break;
case 0X42: // 地址发送结束
// Nuse=I2C->SR3;
I2C_RXCnt=0;
Nuse=I2C->DR;
break;
case 0x44:
//I2C_GenerateSTOP(ENABLE);
I2C_ITConfig(I2C_IT_EVT, DISABLE); //不能少
default:
break;
}
}
|