文章目录
CubeMX HAL库stm32作从机 硬件I2C中断接收无BUG程序
首先,用cube新建一个工程,选择芯片型号,这里我选择了“STM32F103C8T6”作为I2C从机,封装为LQFP48
一.设置烧录模式
二.使用外部晶振
三.开启IIC中断
开启IIC事件中断用于接收数据,同时开始错误中断,当发生I2C错误时打印错误类型,处理错误
四.设置IIC参数
五.配置外部时钟
我板子上外部晶振采用8MHz
六.设置工程信息
尽量使用最新版本的 STM32Cube FW_Fx_Vx.x库
七.代码生成项配置
八.在Keil中打开工程,修改部分代码
在main.c中设置数据缓存区,启动数据接收
uint8_t RE_BUFF[SIZE]; // 数据存储区, 数据长度与主机发送数据长度保持一致
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_WWDG_Init();
MX_I2C1_Init();
HAL_I2C_Slave_Receive_IT(&hi2c1, RE_BUFF, sizeof(RE_BUFF)); // 启动中断接受
while (1)
{
/* USER CODE BEGIN 3 */
HAL_Delay(1);
/* USER CODE END 3 */
}
}
九.加入中断回调函数
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
{
// 数据处理
}
for(uint8_t i=0;i<11;i++)
{
// 清空缓存
RE_BUFF[i] = 0;
}
HAL_I2C_Slave_Receive_IT(&hi2c1, RE_BUFF, sizeof(RE_BUFF));
}
十.加入错误回调函数
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle)
{
// 打印I2C错误类型
// error type 1: HAL_I2C_ERROR_BEER Bus error 总线错误
// error type 4: HAL_I2C_ERROR_AF Acknowledge failure 应答错误
printf("error type %x \n",HAL_I2C_GetError(I2cHandle));
// 先注销I2C硬件,释放I2C接口,再重启I2C
HAL_I2C_DeInit(I2cHandle);
MX_I2C1_Init();
HAL_I2C_Slave_Receive_IT(I2cHandle, RE_BUFF, sizeof(RE_BUFF));
}
使用注意事项
-
i2c.c中从机地址最好为偶数,调试过程中发现设置成0x41以奇数结尾时,无法正常通信. 因为硬件I2C主机发送函数,部分模拟I2C发送函数 在发送地址会<<1左移一位 然后在末尾补0
解决办法如下, 在i2c.c文件中 从机地址也左移一位 -
数据线SDA 与GND地接触 或者总线端子接触不良可能会报 HAL_I2C_ERROR_AF 错误 和HAL_I2C_ERROR_BEER 错误
-
从机用STM32硬件I2C,主机最好不要用STM32硬件I2C,否者出BUG不好查找
-
在main.c中加入中断回调函数处理数据和错误回调函数 ,无需对回调函数声明