OpenEdv-开源电子网

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

AT24C1024读写问题

[复制链接]

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-1-19
在线时间
6 小时
发表于 2014-1-19 19:54:17 | 显示全部楼层 |阅读模式
最近有个项目使用AT24C1024存储参数,但是读写有时正常,有时不正常,请各位高手帮看看。上代码如下:

#ifndef AT24C1024_H_
#define AT24C1024_H_
/////////////////////////////////////////////////////////////////////
#include "sys.h"
#include "delay.h"
#include "config.h"
//#define PARAM_WRITE_ERROR 1
//#define PARAM_WRITE_SUCCESS 0

#define PARAM_LEN_ADDR 0x00

#define PARAM_CURR_PAGE 0
#define PARAM_PAGE_SIZE 256
#define PARAM_PAGE_COUNT 512

#define PARAM_READ_DEVICE_ADDR 0xA1
#define PARAM_WRITE_DEVICE_ADDR 0xA0

///////////////////////////////////////////////////////////////////
////设置PIN高低电平
///////////////////////////////////////////////////////////////////
#define SET_BIT(_port,_bit); _port->ODR|=1<<_bit;
#define CLR_BIT(_port,_bit); _port->ODR&=~(1<<_bit);

//SDA PB15
//SCL PB14
#define PARAM_SDA_HIGH SET_BIT(GPIOB,15)
#define PARAM_SDA_LOW CLR_BIT(GPIOB,15)
#define PARAM_SCL_HIGH SET_BIT(GPIOB,14)
#define PARAM_SCL_LOW CLR_BIT(GPIOB,14)

#define PARAM_SCL_OUT {GPIOB->CRH&=0xF0FFFFFF;GPIOB->CRH|=0x03000000;}
#define PARAM_SDA_OUT {GPIOB->CRH&=0x0FFFFFFF;GPIOB->CRH|=0x30000000;}
#define PARAM_SDA_IN {GPIOB->CRH&=0x0FFFFFFF;GPIOB->CRH|=0x80000000;}
#define GET_PARAM_SDA ((GPIOB->IDR&(1<<15))>>15)

void AT24C1024_Init(void);
void PARAM_Idle(void);
void PARAM_Start(void);
void PARAM_Stop(void);
u8 PARAM_Write(u8 dat);
void PARAM_Write_Byte(u8 H_add,u8 L_add, u8 data);
void PARAM_Write_Bytes(u8 H_add,u8 L_add,u8 data[],u8 len);
u8 PARAM_Read(u8 ackBit);//ackBit: low for ACK, high for None ACK;
u8 PARAM_Read_Byte(u8 H_add,u8 L_add);
void PARAM_Read_Bytes(u8 H_add,u8 L_add,u8 data[],u8 len);

#endif /* AT24C1024_H_ */
源文件如下:
#include "AT24C1024.h"


void AT24C1024_Init(void)
{
    PARAM_SDA_OUT;
PARAM_SCL_OUT;
PARAM_SDA_HIGH;
    PARAM_SCL_HIGH;
}

void PARAM_Idle(void)
{
PARAM_SDA_HIGH;
PARAM_SCL_HIGH;
}

void PARAM_Start(void)
{
PARAM_SDA_OUT;
//PARAM_SCL_OUT;
PARAM_SDA_HIGH;
//delay_us(10);
PARAM_SCL_HIGH;
delay_us(4);
PARAM_SDA_LOW;
delay_us(4);
PARAM_SCL_LOW;
//delay_us(10);
}

void PARAM_Stop(void)
{
PARAM_SDA_OUT;
    PARAM_SCL_LOW;
PARAM_SDA_LOW;
delay_us(4);
PARAM_SCL_HIGH;
PARAM_SDA_HIGH;
delay_us(4);
}

u8 PARAM_Write(u8 dat)
{
u8 i=0,max_try_times=0;
PARAM_SDA_OUT;
PARAM_SCL_LOW;
delay_us(10);
for(i=0;i<8;i++)
{
if(dat&0x80)
{
PARAM_SDA_HIGH;
}
else
{
PARAM_SDA_LOW;
}
PARAM_SCL_HIGH;
delay_us(2);
PARAM_SCL_LOW;
delay_us(2);
dat<<=1;
}
//read the ack bit
PARAM_SDA_IN;
PARAM_SDA_HIGH;
delay_us(10);
PARAM_SCL_HIGH;
delay_us(10);
while((u8)GET_PARAM_SDA)
    {
        max_try_times++; 
        if(max_try_times>=500)
        {
           ARAM_Stop();
           return 1;
        }      
    }
    

delay_us(4);
PARAM_SCL_LOW;
delay_us(4);
return 0;
}

void PARAM_Write_Byte(u8 H_add,u8 L_add, u8 data)
{
PARAM_Start();
PARAM_Write(PARAM_WRITE_DEVICE_ADDR);
PARAM_Write(H_add);
PARAM_Write(L_add);
PARAM_Write(data);
PARAM_Stop();
}



u8 PARAM_Read(u8 ackBit)//ackBit: low for ACK, high for None ACK
{
u8 i,temp;
u16 dat=0x0000;
PARAM_SDA_IN;
//PARAM_SDA_HIGH;

for(i=0;i<8;i++)
{
dat<<=1;
PARAM_SCL_LOW;
delay_us(2);
PARAM_SCL_HIGH;
delay_us(2);
temp=GET_PARAM_SDA;
dat|=temp;
delay_us(2);
}
PARAM_SCL_LOW;
PARAM_SDA_OUT;
if(ackBit)
{
PARAM_SDA_HIGH;
}
else
{
PARAM_SDA_LOW;
}
    delay_us(2);
PARAM_SCL_HIGH;
delay_us(2);
    PARAM_SCL_LOW;
    delay_us(10);
// PARAM_SDA_IN;
// PARAM_SDA_HIGH;
return dat;
}


u8 PARAM_Read_Byte(u8 H_add,u8 L_add)
{
u8 dat;
PARAM_Start();
PARAM_Write(PARAM_WRITE_DEVICE_ADDR);
PARAM_Write(H_add);
PARAM_Write(L_add);
PARAM_Start();
PARAM_Write(PARAM_READ_DEVICE_ADDR);
dat=PARAM_Read(1);
PARAM_Stop();
return dat;
}


void PARAM_Write_Bytes(u8 H_add,u8 L_add,u8 data[],u8 len)
{
    u8 i;
for(i=0;i<len;i++)
{
PARAM_Write_Byte(H_add,L_add+i,data);
}
}



void PARAM_Read_Bytes(u8 H_add,u8 L_add,u8 data[],u8 len)
{
    u8 i;
for(i=0;i<len;i++)
{
data=PARAM_Read_Byte(H_add,L_add+i);
}
}

声明:GPIOB时钟已经使能了。电路原理图见附件。
AT1024C.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-19 21:47:00 | 显示全部楼层
可以参考下我们的代码。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-20 08:33:38 | 显示全部楼层
回复【楼主位】doleph:
---------------------------------
建议楼主多抓几次IIC时序波形分析一下,这样直观

直接下载原子哥的例程看下结果怎么样
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 14:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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