原理图分析
由原理图可知,SCL,SDA对应PB6,PB7。此方法为软件模拟iic操作,本次实验将实现对AT24C02指定地址进行数据的存储和读取,并将数据用lcd显示。此工程直接使用的官方例程提供的iic文件,关于iIc,AT24C02的原理在这里不再叙述。
STM32CubeMX配置
时钟,时钟树配置不再叙述。
其实本次实验直接生成工程即可,不需要配置GPIO,因为在iic文件里有配置相关引脚的函数,不过我们在这配置也没关系,模式什么的不用管,想了解的同学可以去查看i2c.c文件的start函数。
生成工程即可。
代码
我们需要添加用户代码,本次工程涉及lcd,iic两个文件夹:
链接:https://pan.baidu.com/s/1XBkoEnNFpfE1Y-dUVCRW5Q
提取码:6666
将user文件夹放在工程目录下,并且在工程里添加路径。(往节都有介绍)
main.h添加的头文件:
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "i2c.h"
#include "stdio.h"
/* USER CODE END Includes */
main.c定义变量:
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t val = 0; // 存入数据的初始值
char buf[20]; // 用来显示一行lcd的字符串
/* USER CODE END PTD */
AT24C02的读,写代码:
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// AT24C02读取指定地址数据
uint8_t AT24C02_Read(uint8_t address)
{
unsigned char val;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
val = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return(val);
}
// AT24C02在指定地址写数据
void AT24C02_Write(unsigned char address,unsigned char data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
/* USER CODE END 0 */
main函数里的代码:
/* USER CODE BEGIN 2 */
I2CInit(); // -----------
LCD_Init();
//i2c和lcd的初始化——白底清屏,红色字体
LCD_Clear(White);
LCD_SetBackColor(White);
LCD_SetTextColor(Red); // -----------
AT24C02_Write(0, val); // 先向指定地址写入初始数据
HAL_Delay(100); // 写入需要一定的时间,本人测试的延迟1ms也是可以的
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
val = AT24C02_Read(0); // 从指定地址读取数据
sprintf(buf, " AT24C02_DATA:%d ", val); // 将val值放入buf字符串中
LCD_DisplayStringLine(Line4, (uint8_t *)(buf)); // 在第四行显示buf的内容
val++;
AT24C02_Write(0, val); // 将自身加一后的val值写入指定地址
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
运行结果
每一秒加一,当超过255时,即溢出,将重新归零。