OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2623|回复: 14

STM32F103模拟I2C示例代码的其中一段意思?

[复制链接]

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
发表于 2019-11-13 15:37:05 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 hejun96 于 2019-11-13 16:34 编辑
  1. //检查AT24CXX是否正常
  2. //这里用了24XX的最后一个地址(255)来存储标志字.
  3. //如果用其他24C系列,这个地址要修改
  4. //返回1:检测失败
  5. //返回0:检测成功
  6. u8 AT24CXX_Check(void)
  7. {
  8.         u8 temp;
  9.         temp=AT24CXX_ReadOneByte(511);//避免每次开机都写AT24CXX                           
  10.         if(temp==0X55)return 0;                  
  11.         else//排除第一次初始化的情况
  12.         {
  13.                 AT24CXX_WriteOneByte(511,0X55);
  14.             temp=AT24CXX_ReadOneByte(511);         
  15.                 if(temp==0X55)return 0;
  16.         }
  17.         return 1;                                                                                          
  18. }
复制代码

模拟I2C的示例代码中0x55表示的是什么意思?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-11-13 15:53:59 | 显示全部楼层
往某个地址写入某个数据,0x55这个值理论上随意值都可以。往511这个地址都数据,看是否是0x55,如果不是就把511这个地址写0x55,然后再次都,如果读到0x55证明AT24XX器件存在,否则不存在
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-11-13 16:32:36 | 显示全部楼层
本帖最后由 hejun96 于 2019-11-13 16:41 编辑
Electronic 发表于 2019-11-13 15:53
往某个地址写入某个数据,0x55这个值理论上随意值都可以。往511这个地址都数据,看是否是0x55,如果不是就 ...

那如果检测失败应该怎么让他检测成功?现在串口一直打印检测失败,那段函数是返回1,怎么才能返回0?0x55为什么不在511的写地址中?
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-11-13 16:40:26 | 显示全部楼层
hejun96 发表于 2019-11-13 16:32
那如果检测失败应该怎么让他检测成功?现在串口一直打印检测失败,那段函数是返回1,怎么才能返回0?

往511地址写0x55,读出来还不是0x55。证明器件不存在啊。
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-11-13 16:44:46 | 显示全部楼层
Electronic 发表于 2019-11-13 16:40
往511地址写0x55,读出来还不是0x55。证明器件不存在啊。

但是我用的是原子的例程,宏定义也改成AT24C04了,也没查到是哪里出了错
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-11-13 16:47:28 | 显示全部楼层
本帖最后由 Electronic 于 2019-11-13 16:49 编辑
hejun96 发表于 2019-11-13 16:44
但是我用的是原子的例程,宏定义也改成AT24C04了,也没查到是哪里出了错

你的意思是,每次返回的都是1?我没记错的话,EEPROM写入后,需要等待一会,数据才会真正的写入的EEPROM。立马读数据还是以前的数据
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-11-13 16:58:44 | 显示全部楼层
Electronic 发表于 2019-11-13 16:47
你的意思是,每次返回的都是1?我没记错的话,EEPROM写入后,需要等待一会,数据才会真正的写入的EEPROM。 ...

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "usmart.h"         
#include "24cxx.h"         




                                        
//要写入到24c02的字符串数组
const u8 TEXT_Buffer[]={"WarShipSTM32 IIC TEST"};
#define SIZE sizeof(TEXT_Buffer)       
       
int main(void)
{         
        ///u8 key;
        u16 i=0;
        u8 datatemp[SIZE];
        delay_init();                     //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(9600);                 //串口初始化为115200
        ///LED_Init();                                  //初始化与LED连接的硬件接口
        ///LCD_Init();                                   //初始化LCD        
        ///KEY_Init();                                //按键初始化                                 
        AT24CXX_Init();                        //IIC初始化

         
#if 0
        POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        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,"2015/1/15");
         
        LCD_ShowString(30,130,200,16,16,"KEY1:Write  KEY0:Read");        //显示提示信息               
#endif
        while(AT24CXX_Check())//检测不到24c02
        {
                ///LCD_ShowString(30,150,200,16,16,"24C02 Check Failed!");
                printf("24C02 Check Failed!\r\n");
                delay_ms(500);
                ///LCD_ShowString(30,150,200,16,16,"Please Check!      ");
                printf("Please Check!      \r\n");
                delay_ms(500);
                ///LED0=!LED0;//DS0闪烁
        }
        ///LCD_ShowString(30,150,200,16,16,"24C02 Ready!");
        printf("24C02 Ready!");
        ///POINT_COLOR=BLUE;//设置字体为蓝色       
  
        while(1)
        {
               
#if 0
                key=KEY_Scan(0);
                if(key==KEY1_PRES)//KEY_UP按下,写入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);
                        LCD_ShowString(30,170,200,16,16,"24C02 Write Finished!");//提示传送完成
                }
                if(key==KEY0_PRES)//KEY1按下,读取字符串并显示
                {
                        LCD_ShowString(30,170,200,16,16,"Start Read 24C02.... ");
                        AT24CXX_Read(0,datatemp,SIZE);
                        LCD_ShowString(30,170,200,16,16,"The Data Readed Is:  ");//提示传送完成
                        LCD_ShowString(30,190,200,16,16,datatemp);//显示读到的字符串
                }
#endif
                AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);
                delay_ms(500);
               
                AT24CXX_Read(0,datatemp,SIZE);
                i++;
                delay_ms(10);
                if(i==20)
                {
                        ///LED0=!LED0;//提示系统正在运行
                               
                        i=0;
                }                  
        }
}

main.c代码,但是在while(AT24CXX_Check())中,串口一直打印24CXX检测失败,证明返回值一直为1
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-11-13 17:02:07 | 显示全部楼层
你用的是24C04把,24C04和C02有点差别,你仔细查一下手册,24C02的话,写地址的时候只有一个字节,24C04应该是2字节地址
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-11-13 17:02:13 | 显示全部楼层
你用的是24C04把,24C04和C02有点差别,你仔细查一下手册,24C02的话,写地址的时候只有一个字节,24C04应该是2字节地址
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-11-13 17:09:48 | 显示全部楼层
Electronic 发表于 2019-11-13 17:02
你用的是24C04把,24C04和C02有点差别,你仔细查一下手册,24C02的话,写地址的时候只有一个字节,24C04应 ...

24C02是每页8字节,24C04每页16字节。存储容量24C02有256字节,24C04有512字节。其他的应该没有什么区别
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-11-13 17:10:27 | 显示全部楼层
本帖最后由 Electronic 于 2019-11-13 17:20 编辑

我下载了一个手册,看了下。写入的地址还是1字节,只是把第8位地址刚在器件的值的第1位上,你可以打开这个手册看一下就明白了。 AT24C01C-AT24C02C-AT24C04C-AT24C08C-Data-Sheet-20006141A.pdf (1.19 MB, 下载次数: 1)
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-11-13 17:21:57 | 显示全部楼层
Electronic 发表于 2019-11-13 17:10
我下载了一个手册,看了下。写入的地址还是1字节,只是把第8位地址刚在器件的值的第1位上,你可以打开这个 ...

#ifndef __24CXX_H
#define __24CXX_H
#include "myiic.h"   
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//24CXX驱动 代码(适合24C01~24C16,24C32~256未经过测试!有待验证!)                  
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/9
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////

#define AT24C01                127
#define AT24C02                255
#define AT24C04                511
#define AT24C08                1023
#define AT24C16                2047
#define AT24C32                4095
#define AT24C64            8191
#define AT24C128        16383
#define AT24C256        32767  
//Mini STM32开发板使用的是24c02,所以定义EE_TYPE为AT24C02
#define EE_TYPE AT24C04 //原宏为24C02
                                          
u8 AT24CXX_ReadOneByte(u16 ReadAddr);                                                        //指定地址读取一个字节
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite);                //指定地址写入一个字节
void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len);//指定地址开始写入指定长度的数据
u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len);                                        //指定地址开始读取指定长度数据
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite);        //从指定地址开始写入指定长度的数据
void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead);           //从指定地址开始读出指定长度的数据

u8 AT24CXX_Check(void);  //检查器件
void AT24CXX_Init(void); //初始化IIC
#endif

宏定义已经把所有的型号都列举了
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-11-13 17:44:25 | 显示全部楼层
那你在线调试一下代码,看看数据有没有写进去
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-11-13 17:44:34 | 显示全部楼层
那你在线调试一下代码,看看数据有没有写进去
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-11-13 19:21:42 | 显示全部楼层
本帖最后由 hejun96 于 2019-11-13 20:51 编辑
Electronic 发表于 2019-11-13 17:44
那你在线调试一下代码,看看数据有没有写进去

我调试后显示的是24C04检测失败
24C04 Check Failed!
Please Check!

串口一直打印这两句
只有把temp的值改为0x00,串口才会打印24C04 Already
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 00:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表