如何在EEPROM中存入五个数组,再读出来?请注意查收快递 英文是数组,不需要IIC函数,只想知道主函数里怎么用

EEPROM的IIC程序问题。无错误、无警告,就是烧到52中不能实现。求解。。。。_百度知道
EEPROM的IIC程序问题。无错误、无警告,就是烧到52中不能实现。求解。。。。
i++){scl=1;stop();delay5us();respond();i++){date&y--);/8;respond();dalay(200);&for(i=0;scl=1;date=(date&P1=re_dat(23);sda=CY;wr_b(0xa1);}void wr_dat(wr_b(0xa0);}void wr_b(uchar date){scl=1;wr_b(date);void delay5us(){;x--)for(y=110;date=re_b();sda=0;delay5us(),start();delay5us();sbit sda=P2^0;start();250));#define uchar unsigned char#define uint unsigned intsbit scl=P2^1;}uchar re_dat(uchar address){0;delay5us();wr_b(address);i&respond();scl=0;8;while((sda==1)&&(i++&i&delay5us();delay5us();respond();delay5us();}void respond(){delay5us(),y;respond();wr_dat(23;}void inti(){sda=1,0xaa);respond();}void start(){sda=1;respond();sda=1;wr_b(address);scl=0;y&delay5us();delay5us();;wr_b(0xa0);delay5us();scl=1;}void main(){inti();/}void dalay(uchar z){1)|for(i=0;=1;for(x=z;delay5us();delay5us();}}uchar re_b(){0;}void stop(){sda=0,uchar date ){start();scl=1;reg52;stop();while(1);x&delay5us();delay5us().h&scl=1;scl=0;&}return date#include&lt
我有更好的答案
把波形发来,我帮你分析,首先得确定是MCU的问题还是IIC从设备硬件电路的问题用示波器看
最好自己调试下,用示波器看看P2^1和P2^0这两个管脚上的信号是否跟你想的一致呢?
其他类似问题
为您推荐:
eeprom的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁AVR ATMEGA16 eeprom_write_block 函数 在操作int 类型数组的时候,怎么读和写呢。_百度知道
AVR ATMEGA16 eeprom_write_block 函数 在操作int 类型数组的时候,怎么读和写呢。
还是需要另外转换,他能操作了吗,如果这个数组有10个,INT数组变量给他,我直接把大小写成20个我的疑惑时int是2字节的 而这个函数操作一个自己的
我有更好的答案
那么你给的int数据的高8位就被忽略了。这就不行啦,如果你给一个int,你给的参数当然得是一个字节的啦既然那个函数的入口参数是一个字节的,那会强制转换为1个字节的数据类型的
void eeprom_read_block(void *buf,const void *addr,size_t n)这个函数,您给看看,没有入口函数的变量。
其他类似问题
为您推荐:
atmega16的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁君,已阅读到文档的结尾了呢~~
基于IIC协议的EEPROM读写功..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于IIC协议的EEPROM读写功能 的实现
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口请教:应该是很简单的IIC Eeprom读写问题求助 !-电子产品世界论坛
请教:应该是很简单的IIC Eeprom读写问题求助 !
是在一个S3C4510B的板子上调试一块24c02的IIC
eeprom,这么一个小芯片调了一周了,总是不对,真是郁闷,还请各位支个招,3Q
程序的问题是写入的数据和读出的数据对不上,而且每次读取,读出的第一个数据总是0xa1,而这个值正好是设备地址和读/写指令位的值,不知道原因究竟是什么,程序运行结果及源代码如下:
1、运行结果(程序会读写几乎整个芯片):请注意,我首先对几乎整个芯片我写入同一个数据,然后再每次采用随机序列读,读取17字节数据,而每次都是从16的整数倍地址开始读取,也就是说其实我每次第一个读取的数据都应该是上一次读取的最后一个数据,这样做的目的是因为我第一个读取的数据总是设备地址,不是我真正想要的数据,所以我就每次多读一个数据,不知程序是读的错误还是写的错误Write data in Hex:Addr 0x00 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x10 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x20 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x30 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x40 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x50 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x60 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x70 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x80 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x90 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0xa0 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0xb0 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0xc0 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0xd0 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0xe0 :0x 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
Readback data in Hex:Addr 0x00 :0x a1 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x10 :0x 80 df
ffAddr 0x20 :0x a1 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x30 :0x 80 df
ffAddr 0x40 :0x a1 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x50 :0x 80 df ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff--不再重复标识及排版,见凉!Addr 0x60 :0x a1 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x70 :0x 80 df ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0x80 :0x a1 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0x90 :0x 80 df ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0xa0 :0x a1 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0xb0 :0x 80 df ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0xc0 :0x a1 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0xd0 :0x 80 df ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0xe0 :0x a1 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37Addr 0xf0 :0x a1 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffTest Finished.2、源代码:我看了以前的《I2C总线EEPROM应用笔记》,上面关于24c02的说法跟芯片资料有点冲突,芯片资料说pagesize是8,而应用笔记上说是16,我是按8操作的,程序是由网上一位网友说已经成功运行的程序改写的,代码如下:#define IICCON (*(volatile unsigned *)0x3FFF000)#define IICBUF (*(volatile unsigned *)0x3FFF004)#define IICPS (*(volatile unsigned *)0x3FFF008)
#define U16 unsigned short#define U8
unsigned char
#define MHz 1000000#define KHz 1000#define fMCLK 50*MHz#define fSCL 50*KHz#define PAGE_SIZE 8#define IIC_DEV_0 0xa0
// IIC device's slave address#define S_WRITE
// Write IIC data for slave#define S_READ
// Read IIC data for slave#define BF
// Buffer flag#define IEN
// Interrupt enable#define LRB
// Last bit received/ACK not received#define ACK
// Ack enable/Generate an ACK signal at 9th SCL#define NOACK
// No more received data is required from the slave#define START
0x10#define STOP
0x20#define RESTART
0x30#define BUSY
0x40#define IICRESET 0x80
// Reset the IIC-BUS controller#define SET_BF
0x01#define CLR_BF
0x00#define BUFF_SIZE
0x20#define WRITE_SIZE
0x10#include &stdio.h&
U8 IICTestAU8 buff_w[BUFF_SIZE],buff_r[BUFF_SIZE];
void delay(unsigned int count){
unsigned int i,j,k;
for(i=0;i&i++)
for(j=0;j&0j++)
for(k=0;k&0k++);}
SetPreScaler(int sclk){
return((int)(((fMCLK/sclk)-3.0)/16.0)-0.5);
//add 0.5 for}
void IICSetup(void){
IICCON = IICRESET ;
IICPS = SetPreScaler((int)fSCL);
//support upto 100KHz}void IICWrite(void){
// 以下代码段写一个字符串到IIC总线上,写入相应的EEPROM中
IICSetup() ;// Initialize IIC control block,完全和SNDS100中的一样
//Step 1: Setup IICON register for transmit start
while(IICCON & BUSY);
// Wait! the iic bus is busy
IICCON = START|ACK|IEN; // Now, Start to transmit
//Send Slave Address and Write command
IICBUF = IIC_DEV_0|S_WRITE;
while (!(IICCON & BF));
// SEND ADDRESS TO WRITE
IICBUF = IICTestA
while (buff_w[i]!= 0)// Buff是一个字符数组,我用来缓存准备输出的字符串
// Send test data: TestData
while (!(IICCON & BF));
IICBUF = buff_w[i];
while (!(IICCON & BF));
//STOP IIC Controller
IICCON = STOP;}
void IICRead(void){
//以下代码检验是否正确写入,将前面写的数据读出来
IICSetup() ;// Initialize IIC control block
//Step 1: Setup IICON register for receive start
while(IICCON & BUSY);//Wait! the iic bus is busy
IICCON = START|ACK|IEN;
//Send Slave Address and Write command
IICBUF = IIC_DEV_0|S_WRITE;
while (!(IICCON & BF));
//Send byte address: MSB
IICBUF = IICTestA
while (!(IICCON & BF));
/* Repeat Start */
IICCON = RESTART;
IICCON = START|ACK|IEN;
IICBUF = IIC_DEV_0|S_READ;
for (i=0;i&PAGE_SIZE*2+1;i++)//读取两页
while (!(IICCON & BF));
// BUFFER FULL
buff_r[i] = IICBUF;
/* STOP IIC Controller */
IICCON = STOP;}int main(void){
IICTestAddr = 0x0;
for( i = 0; i& BUFF_SIZE; i++)//初始化
buff_w[i] = 0;
buff_r[i] = 0;
//初始化待写的字符
for(i=0;i&PAGE_SIZE;i++)buff_w[i]=55;
printf("Write data in Hex:\n");
for(j=0;j&15;j++)
{//写芯片,共16*8*2字节,留下最后的16字节不写
printf("Addr 0x%02x :0x ",IICTestAddr);
for(i=0;i&PAGE_SIZE;i++)//输出第一页待写数据
printf("%02x ",buff_w[i]);
IICWrite();//写第一页
delay(30);
IICTestAddr+=PAGE_SIZE;
for(i=0;i&PAGE_SIZE;i++)//输出第二页待写数据
printf("%02x ",buff_w[i]);
IICWrite();//写第二页
delay(30);
IICTestAddr+=PAGE_SIZE;
printf("\n");
IICTestAddr = 0x0;
printf("Readback data in Hex:\n");
for(j=0;j&16;j++)//读芯片,16*8*2字节
printf("Addr 0x%02x :0x ",IICTestAddr);
IICRead();
for(i=0;i&PAGE_SIZE*2+1;i++)
printf("Test Finished.\n");
return 0;}谢谢指教,谢谢 !
[align=right][color=#000066][此贴子已经被作者于 10:27:58编辑过][/color][/align]
关键词:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
单个字节能读写正确吗?
不要对整个芯片写入同一个数据吧,这样读的时候根本不知道地址是否弄对了。
也不行,单个字节读取,读出的值始终是0xa1,不知何故 !
每次读取的时候我都输出了读取地址的啊,应该地址不会出错吧 ?
[align=right][color=#000066][此贴子已经被作者于 11:38:40编辑过][/color][/align]
while(IICCON & BUSY);//
while (!(IICCON & BF));我不知道S3C4510B的软逻辑是怎样的,不过我有个建议:上面这两条语句前如果做清零动作,会更保险.
还有,你可用硬逻辑做啊?
硬逻辑 ? 软逻辑 ?什么意思啊 ? 还请再具体说说,3Q
另外,采纳xiajiashan的意见,修改了读写函数,但是最后结果还是不对(代码大体一致,只是加了bf的清楚和设置操作,代码修改部分已用红色标注),不过第一字节读出来不再是0xa1了,所以应该还是解决了部分问题,但是最终还是有问题 !
while(IICCON & BUSY)--因为我每次使用IIC都是对IIC控制器复位了的,而且IICCON中BUSY位只读,所以不能清零,另外写进去的数据也改为不同的了,详见后面程序运行结果。
void IICWrite(void){U8// 以下代码段写一个字符串到IIC总线上,写入相应的EEPROM中IICSetup() ;// Initialize IIC control block,完全和SNDS100中的一样//Step 1: Setup IICON register for transmit startwhile(IICCON & BUSY);IICCON = START|ACK|IEN; // Now, Start to ransmit//Send Slave Address and Write commandIICBUF = IIC_DEV_0|S_WRITE;while (!(IICCON & BF));IICCON = IICCON & CLR_BF;//清bf位,即清BUFIICCON = IICCON | SET_BF;//按照芯片资料写BUF前置位bf位// SEND ADDRESS TO WRITEIICBUF = IICTestAi=0;while (buff_w[i]!= 0)// Buff是一个字符数组,我用来缓存准备输出的字符串{
// Send test data: TestData
while (!(IICCON & BF));
IICCON = IICCON & CLR_BF;//清bf位,即清BUF
IICCON = IICCON | SET_BF;//按照芯片资料写BUF前置位bf位
IICBUF = buff_w[i];
i++;}while (!(IICCON & BF));//STOP IIC ControllerIICCON = STOP;}
void IICRead(void){U8//以下代码检验是否正确写入,将前面写的数据读出来IICSetup() ;// Initialize IIC control block//Step 1: Setup IICON register for receive startwhile(IICCON & BUSY);//Wait! the iic bus is busyIICCON = START|ACK|IEN;//Send Slave Address and Write commandIICBUF = IIC_DEV_0|S_WRITE;while (!(IICCON & BF));IICCON = IICCON & CLR_BF;IICCON = IICCON | SET_BF;//Send byte address: MSBIICBUF = IICTestAwhile (!(IICCON & BF));/* Repeat Start */IICCON = RESTART;IICCON = START|ACK|IEN;IICBUF = IIC_DEV_0|S_READ;while (!(IICCON & BF));//IICCON = IICCON & CLR_BF;//IICCON = IICCON | SET_BF;for (i=0;i&PAGE_SIZE*2+1;i++)//读取两页{
IICCON = IICCON & CLR_BF;//清bf位,即清BUF
while (!(IICCON & BF));
IICCON = IICCON | SET_BF;//按照芯片资料读BUF前置位bf位
buff_r[i] = IICBUF;}/* STOP IIC Controller */IICCON = STOP;}
程序运行结果如下:
Write data in Hex:Addr 0x00 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x10 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x20 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x30 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x40 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x50 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x60 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x70 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x80 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0x90 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0xa0 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0xb0 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0xc0 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0xd0 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Addr 0xe0 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08Readback data in Hex:Addr 0x00 :0x 55 55 55 55 55 55 55 55 01 02 03 04 05 06 07 08 01Addr 0x10 :0x 17 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0x20 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 01Addr 0x30 :0x 17 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0x40 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 01Addr 0x50 :0x 17 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0x60 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 01Addr 0x70 :0x 17 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0x80 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 01Addr 0x90 :0x 17 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0xa0 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 01Addr 0xb0 :0x 17 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0xc0 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 01Addr 0xd0 :0x 17 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffAddr 0xe0 :0x 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 ffAddr 0xf0 :0x ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 55Test Finished.
[align=right][color=#000066][此贴子已经被作者于 23:07:50编辑过][/color][/align]
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有DSP28335用IIC挂了一个EEPROM(AT24C512),其中SDA口进来的数据是不是需要用中断来一个一个读取?_百度知道
DSP28335用IIC挂了一个EEPROM(AT24C512),其中SDA口进来的数据是不是需要用中断来一个一个读取?
}程序就是上面这个.GPBDAT.GPIO32,SDA用的就是GpioDataR
return(c);/
c=c& 输入1位
c=c|d;&lt!标题不对;
c=GpioDataR/i&lt?望大神指教;c为8位数据
DSP28x_usDelay(10000).GPBDAT;
switch_sda_in();&#47.GPIO32?还是这种数据要用中断接收.GPBDAT;&#47./发送完c==0,是我哪里没设置对.GPIO32进来的一直是1;i++)
d=GpioDataR
c=0.GPBDAT;
c=0,这里的GpioDataR
&#47unsigned char I2C_DATA_IN(void){
unsigned char i.bit.bit,d;1,c;
if(c==0x08)
28335为32位
}/一直在发送的时候c==0x08;/
for(i=0;SDA
d=d|0x01,用28335的IIC对AT24C512进行读写.8
设置有问题,GPIO与Peripheral的设置是不同的,SDA不是GPIO,而是Peripheral
我在初始化里用GpioCtrlRegs.GPBMUX1.bit.GPIO32=1已经设置成外设功能了啊
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 请注意查收 英文 的文章

 

随机推荐