事情起因
需要用pca9555芯片来扩展单片机的IO口,pca9555的管理是通过I2C总线做的管理。
注意:
把原来的代码目录,连同cubeMX工程单独copy一份,放在临时文件夹中。
安装好相应版本的CubeMX(版本号可以在*.ioc工程文件中找到)。
CubeMX的下载网址:
https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html
双击打开目录中的*.ioc的工程文件 – 可以用CubeMX打开工程了。
在Pinout标签页中,把PB10选为I2C2_SCL(时钟) PB11选功能为I2C2_SDA(数据)。
在configuration 页签中,打开Connectivity—I2C2,
Project — Setting 调整生成代码的设置
Project — Generate Code
用代码比较工具beyondcompare比较新生成代码和老的代码目录,谨慎的把新生成的代码合入到老的代码目录中去。在keil中把新生产的文件也加入到工程中。
新生成的文件 i2c.c i2c.h ; 还有一些文件的内容发生了改变例如gpio.c main.c 也要将改变的内容谨慎的比较合入。
写
HAL_StatusTypeDef I2C_PCA9555_WriteBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
{
HAL_StatusTypeDef status = HAL_OK;
//printf("1write i2c addr %x,reg %x\r\n",Addr,Reg);
Addr = (Addr << 1) | 0;
//printf("2write i2c addr %x,reg %x\r\n",Addr,Reg);
status = HAL_I2C_Mem_Write(&hi2c2, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, 1000);
if (status != HAL_OK) {
printf("\r\ni2c error status:%d\r\n",status);
I2C_PCA9555_Error();
}
return status;
}
读
HAL_StatusTypeDef I2C_PCA9555_ReadBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
{
HAL_StatusTypeDef status = HAL_OK;
//printf("1read i2c addr %x,reg %x\r\n",Addr,Reg);
Addr = (Addr << 1) | 1;
//printf("2read i2c addr %x,reg %x\r\n",Addr,Reg);
status = HAL_I2C_Mem_Read(&hi2c2, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, 1000);
if (status != HAL_OK) {
printf("i2c status:%d\r\n",status);
I2C_PCA9555_Error();
}
return status;
}
因为逻辑分析仪是3.3V 设备是2.8V存在压差,压差把电阻改烧了,结果导致mcu和i2c器件之间不通,以后遇到此种情况要记得测量电阻是否是被烧了。