网上都说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;
- }
- }
|