用cubeMX开发I2C驱动过程

用cubeMX开发I2C驱动过程

事情起因
需要用pca9555芯片来扩展单片机的IO口,pca9555的管理是通过I2C总线做的管理。

注意事项

注意:

  • 一定不要在主目录里做,要把cubeMX的工程 连同代码copy一份,用来生成代码。以免新生成的代码把以前的代码覆盖掉。

怎么在已有的cubeMX工程生成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,

    • I2C Speed Mode Fast mode
    • I2C Speed Frequency (KHz) 100 //这个频率要查询pca9555(i2c器件)手册来配置
      一般手册在feature里都有说器件的频率范围。
    • Rise Time (ns) 300 //需要查I2C器件来获取该值
    • Fall Time (ns) 300 //需要查I2C器件来获取该值
    • 其它根据实际情况进行设置
  • Project — Setting 调整生成代码的设置

  • Project — Generate Code

  • 用代码比较工具beyondcompare比较新生成代码和老的代码目录,谨慎的把新生成的代码合入到老的代码目录中去。在keil中把新生产的文件也加入到工程中。

  • 新生成的文件 i2c.c i2c.h ; 还有一些文件的内容发生了改变例如gpio.c main.c 也要将改变的内容谨慎的比较合入。

如何调用I2C的驱动?

  • I2C的初始化
    HAL_I2C_MspInit(&hi2c2);
    MX_I2C2_Init();
  • 调用驱动里的读写函数读写

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;
}
  • 还会涉及到gpio中对两个gpio的初始化。
  • 注意点, 很关键因为调试这个花费了一些时间。
    • Addr = (Addr << 1) | 0; 对于写,要把地址向左移动一位,最后一位置0.
    • Addr = (Addr << 1) | 1; 对于读,要把地址向左移动一位,最后一位置1.

没波形问题是如何解决的?

因为逻辑分析仪是3.3V 设备是2.8V存在压差,压差把电阻改烧了,结果导致mcu和i2c器件之间不通,以后遇到此种情况要记得测量电阻是否是被烧了。

你可能感兴趣的:(物联网)