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学习手册-使用BootLoader通过串口下载固件
STM32G0学习手册-使用BootLoader通过串口下载固件