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

Posted SCCELE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32G0学习手册——I2C总线使用(使用硬件I2C-HAL库)相关的知识,希望对你有一定的参考价值。

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位(),有4个块区域,每个区域有256字节。,这就是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、编译好固件后,烧录进去芯片。串口输出如下

 

 

以上是关于STM32G0学习手册——I2C总线使用(使用硬件I2C-HAL库)的主要内容,如果未能解决你的问题,请参考以下文章

STM32G0学习手册——使用HAL库进行EXTI中断实验

STM32G0学习手册-使用BootLoader通过串口下载固件

STM32G0学习手册-使用BootLoader通过串口下载固件

STM32G0学习手册——多串口同时使用printf输出

STM32G0学习手册——移植FreeRTOS v202107.00

STM32G0学习手册——移植FreeRTOS v202107.00