你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G0学习手册——I2C总线使用(使用硬件I2C-HAL库)

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:08
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

这里使用的是G071RB开发板,已经自带有24C08A芯片,是一个8K的EEPROM芯片,使用I2C总线来控制这个芯片,写入数据。

实验步骤
1、CubeMx中芯片选择STM32G071RBTx,新建工程

2、开启SWD调试、HSE

20200710210326903.png


20200710210417612.png


3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1

2020071021064272.png


4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚

20200710211139405.png 20200710211620223.png


5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数

20200710212115736.png


6、设置时钟树,HCLK=64MHz

20200710212802195.png


7、在工程管理里面,设置好参数,生成代码使用MDK打开。

20200710213244172.png


20200710213308820.png


代码部分
1、在Debug选项卡中,Flash Download勾上“Reset and Run”

2、添加printf打印代码,在usart.c文件添加如下代码

  1. /* USER CODE BEGIN 0 */
  2. #include <stdio.h>
  3. /* USER CODE BEGIN 0 */
  4. #ifdef __GNUC__
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  6.      set to 'Yes') calls __io_putchar() */
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  8. #else
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  10. #endif /* __GNUC__ */
  11. /**
  12.   * @brief  Retargets the C library printf function to the USART.
  13.   * @param  None
  14.   * @retval None
  15.   */
  16. PUTCHAR_PROTOTYPE
  17. {
  18.   /* Place your implementation of fputc here */
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  21.   return ch;
  22. }
  23. /* USER CODE END 0 */
复制代码

3、设置24C08A的地址

这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址

20200710214406373.png


在i2c.h文件中添加如下代码
  1. /* USER CODE BEGIN Includes */

  2. #define ADDR_24LC08_WRITE 0XA0                 //设备地址和写指令
  3. #define ADDR_24LC08_READ  0XA1                 //设备地址和读指令
  4. #define BufferSize 15

  5. /* USER CODE END Includes */
复制代码

4、在main.c文件中添加如下代码

  1. /* USER CODE BEGIN Includes */
  2. #include <stdio.h>
  3. #include <string.h>
  4. uint16_t i;
  5. /* USER CODE END Includes */

  6. int main(void)
  7. {
  8. *
  9. *
  10. *
  11. /* USER CODE BEGIN 2 */
  12.   uint8_t writerbuff[BufferSize]="This is a test.";
  13.   uint8_t readbuff[BufferSize];
  14.   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片

  15. if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)
  16.   printf("Write succeeded.\r\n");
  17.   else
  18.   printf("Write failed.\r\n");
  19.   HAL_Delay(5);                                                   //等待芯片写周期完成
  20.   HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);
  21.   printf("The data in the chip is as follows:\r\n");
  22.   for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来
  23.   {
  24.     printf("%c",readbuff<i>);
  25.   }
  26.   if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致
  27.     printf("\r\nVerification succeeded.\r\n");
  28.   else
  29.     printf("\r\nVerification failed.\r\n");
  30. *
  31. *
  32. *
  33. }</i>
复制代码

5、编译好固件后,烧录进去芯片。串口输出如下

20200710233907215.png

收藏 评论0 发布时间:2021-11-8 16:08

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版