各位大神,我在使用原子大神的探索者做AT24C02读写测试,原子大神的例子是读写1个文字,我改成读写一组设定的数值,完毕编译都无错误,但就是读出的和设定的不一样,不知道哪里有问题,麻烦各位大神帮忙看下。
说明下,我的目的是key1按下,写入设定值到AT24C02里面存储,key0按下,读出AT24C02里的设定值并显示在LCD上。
主程序如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "usmart.h"
#include "24cxx.h"
/************************************************
ALIENTEK 探索者STM32F407开发板 实验24
IIC实验-HAL库函数版
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
//要写入到24c02的字符串数组
const u8 TEXT_Buffer[]={"Explorer STM32F4 IIC TEST"};//定义一个数组,数组内容是Explorer STM32F4 IIC TEST
#define SIZE sizeof(TEXT_Buffer)
int main(void)
{
u8 key;
u16 i=0;
u8 datatemp[SIZE];
unsigned char dat[16];//定义写入的数据暂存数组
unsigned char ddd[16];//定义读出的数据暂存数组
u8 t1=3,t2=90,t3=124,t4=37;//定义写入数据映射
u8 d1,d2,d3,d4;//定义读出数据映射
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz
delay_init(168); //初始化延时函数
uart_init(115200); //初始化USART
usmart_dev.init(84); //初始化USMART
LED_Init(); //初始化LED
KEY_Init(); //初始化KEY
LCD_Init(); //初始化LCD
AT24CXX_Init(); //初始化IIC
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");
LCD_ShowString(30,70,200,16,16,"IIC TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2016/1/13");
LCD_ShowString(30,130,200,16,16,"KEY1:Write KEY0:Read"); //显示提示信息
//Write_Flash(dat,0,16); //将dat数组中的数据写入AT24C02中地址从0开始
//Read_Flash(dat,1,16); //读出AT24C02中从地址1开始依次往后16个字节放入dat数组中
while(AT24CXX_Check())//检测不到24c02
{
LCD_ShowString(30,150,200,16,16,"24C02 Check Failed!");
delay_ms(500);
LCD_ShowString(30,150,200,16,16,"Please Check! ");
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
LCD_ShowString(30,150,200,16,16,"24C02 Ready!");
POINT_COLOR=BLUE;//设置字体为蓝色
while(1)
{
key=KEY_Scan(0);
//key1按下,写入数据
if(key==KEY1_PRES)//KEY1按下,写入24C02
{
LCD_Fill(0,170,239,319,WHITE);//清除半屏
LCD_ShowString(30,170,200,16,16,"Start Write 24C02....");
//AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);
dat[0]=t1;
dat[1]=t2;
dat[2]=t3;
dat[3]=t4;
AT24CXX_Write(0,(u8*)dat,16); //将dat数组中的数据写入AT24C02中地址从0开始
LCD_ShowString(30,170,200,16,16,"24C02 Write Finished!");//提示传送完成
}
//key0按下,读取数据
if(key==KEY0_PRES)//KEY0按下,读取字符串并显示
{
LCD_ShowString(30,170,200,16,16,"Start Read 24C02.... ");
//AT24CXX_Read(0,datatemp,SIZE);
AT24CXX_Read(0,(u8*)ddd,16);//读出AT24C02中从地址1开始依次往后16个字节放入dat数组中
LCD_ShowString(30,170,200,16,16,"The Data Readed Is: ");//提示传送完成
LCD_ShowString(30,190,200,16,16,datatemp);//显示读到的字符串
}
d1=ddd[0];//读到的数据映射
d2=ddd[1];//读到的数据映射
d3=ddd[2];//读到的数据映射
d4=ddd[3];//读到的数据映射
i++;
delay_ms(10);
if(i==20)
{
LED0=!LED0;//提示系统正在运行
i=0;
}
LCD_ShowxNum(10,3,t1,4,16,0);//显示写入的数值
LCD_ShowxNum(50,3,t2,4,16,0);
LCD_ShowxNum(90,3,t3,4,16,0);
LCD_ShowxNum(130,3,t4,4,16,0);
LCD_ShowxNum(10,20,ddd[0],4,16,0);//显示读到的数值
LCD_ShowxNum(50,20,ddd[1],4,16,0);
LCD_ShowxNum(90,20,ddd[2],4,16,0);
LCD_ShowxNum(130,20,ddd[3],4,16,0);
LCD_ShowxNum(10,37,d1,4,16,0);//显示读到的映射数据
LCD_ShowxNum(50,37,d2,4,16,0);
LCD_ShowxNum(90,37,d3,4,16,0);
LCD_ShowxNum(130,37,d4,4,16,0);
}
}
LCD显示截图如下
|