STM32G0学习手册——I2C总线使用(使用硬件I2C-HAL库)

本文介绍如何使用I2C总线在STM32G071RB开发板上控制24C08A EEPROM芯片,包括配置步骤、代码实现及验证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。最新的I2C标准协议是2014年第6版本:UM10204_I2C-bus specification and user manual

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

GitHub项目地址:I2C-Demo

实验步骤

1、CubeMx中芯片选择STM32G071RBTx,新建工程

2、开启SWD调试、HSE

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

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

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

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

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

 

代码部分

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

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

/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 0 */

3、设置24C08A的地址

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

在i2c.h文件中添加如下代码

/* USER CODE BEGIN Includes */

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

/* USER CODE END Includes */

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

/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
uint16_t i;
/* USER CODE END Includes */

int main(void)
{
*
*
*
/* USER CODE BEGIN 2 */
  uint8_t writerbuff[BufferSize]="This is a test.";
  uint8_t readbuff[BufferSize];
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片
 
 if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)
  printf("Write succeeded.\r\n");
  else
  printf("Write failed.\r\n");
  HAL_Delay(5);                                                   //等待芯片写周期完成
  HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);
  printf("The data in the chip is as follows:\r\n");
  for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来
  {
    printf("%c",readbuff[i]);
  }
  if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致
    printf("\r\nVerification succeeded.\r\n");
  else
    printf("\r\nVerification failed.\r\n");
*
*
*
}

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值