Created: April 23, 2023 10:20 AM
Created by: Luser
Type: MCU
本次实验MDK工程下载地址:点击下载
实验向导
实验器材:
阿波罗STM32F429开发板
实验目的:
学习STM32模拟IIC的使用,驱动24C02实现EEPROM数据读写.
硬件资源:
- DS0(连接在PB1)
- 串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面)
- ALIENTEK 2.8/3.5/4.3/7寸LCD模块(包括MCU屏和RGB屏,都支持)
- 按键KEY0(PH3)/KEY1(PH2)
- 24C02(IIC连接在PH4/PH5上面)
实验现象:
本实验通过KEY1按键来控制24C02的写入,通过另外一个按键KEY0来控制24C02的读取。并在LCD模块上面显示相关信息。由于缺少LCD屏,故使用SPI接口的OLED屏对实验内容进行显示
硬件接线
首先将七脚的SPI OLED屏接到下图所示位置:
之所以接到这是因为这里刚好有GND和VDD引脚与OLED的GND和VCC相对应,其余的引脚则只需要将对应的GPIO口设置为相应功能就可以直接将OLED屏插上去进行使用了。
对应的引脚需要查看主板的原理图,这里列出引脚对应的GPIO:
OLED引脚名 | 功能 | 主板上对应引脚名 | 对应的GPIO口 | User Label |
---|---|---|---|---|
D0 | spi(CLK) [SCL] | BL | PB5 | OLED_SCL |
D1 | spi(MOSI) [SDA] | D15 | PD10 | OLED_SDA |
RES | 复位引脚拉高 | D13 | PD8 | OLED_RES |
DC | 低电平写命令, 高电平写数据 | D11 | PE14 | OLED_DC |
CS | 片选 | D6 | PE9 | OLED_CS |
CubeMX初始化配置
设置各个GPIO引脚
OLED、开关KEY0、KEY1、KEY_UP、LED0、LED1
注意KEY0和KEY1是上拉电阻,KEY_UP是下拉电阻
设置IIC
一定要对应到PH4/PH5上,因为稍后要对24C02进行驱动,而它的IIC连接在PH4/PH5上面
注意例程中使用的是软件模拟的IIC,并没有开启硬件IIC,所以在CubeMX中只要设置为输出
设置RCC与时钟频率
程序移植
直接将例程中的头文件和源文件移植到工程中就可以使用,当然也可以只移植部分代码,比如sys.c中的宏定义可以直接在main.c
中进行定义,之后就只需要把#include “sys.h”
换成#include “main.h”
就好了,至于delay.c
中的函数则可以在用到其中的延时函数时直接用HAL_Delay()
函数平替掉,这里为了省事就不进行这些操作,直接移植库:
主函数编写
//main.c文件部分代码
//只包含宏定义与main函数
#include "main.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "sys.h"
#include "key.h"
#include "delay.h"
#include "oled.h"
#include "24cxx.h"
#define LED0 PBout(1) //LED0
#define LED1 PBout(0) //LED1
/* USER CODE END Includes */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//要写入到24c02的字符串数组
const u8 TEXT_Buffer[]={"STM32 IIC TEST"};
#define T_SIZE sizeof(TEXT_Buffer)
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
delay_init(180); //初始化delay
OLED_Init(); //初始化OLED
AT24CXX_Init(); //初始化IIC
u8 key;
u16 i=0;
u8 datatemp[T_SIZE];
OLED_Clear();
OLED_ShowString(0,0,"F429 IIC TEST",12);
OLED_ShowString(0,1,"KEY1:Write",12);
OLED_ShowString(0,2,"KEY0:Read",12);
while(AT24CXX_Check())//检测不到24c02
{
OLED_ShowString(0,3,"24C02 Check Failed!",12);
delay_ms(500);
OLED_ShowString(0,3,"Please Check!",12);
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
OLED_ShowString(0,3,"24C02 Ready!",12);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
key=KEY_Scan(0);
if(key==KEY1_PRES)//KEY1按下,写入24C02
{
OLED_Clear();
OLED_ShowString(0,0,"Start Write....",12);
AT24CXX_Write(0,(u8*)TEXT_Buffer,T_SIZE);
OLED_ShowString(0,1,"Write Finished!",12);//提示传送完成
}
if(key==KEY0_PRES)//KEY0按下,读取字符串并显示
{
OLED_Clear();
OLED_ShowString(0,0,"Start Read...",12);
AT24CXX_Read(0,datatemp,T_SIZE);
OLED_ShowString(0,1,"The Data Is:",12);//提示传送完成
OLED_ShowString(0,2,datatemp,12);//显示读到的字符串
}
i++;
delay_ms(10);
if(i==20)
{
LED0=!LED0;//提示系统正在运行
i=0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
实验现象
-
检测到24c02
-
按下KEY1,写入数据
-
按下KEY0,读取数据