打印
[AVR单片机]

自己写的eeprom多字节读写,怎么丢失偶数位啊

[复制链接]
3921|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
自己按照eeprom的格式进行了设计,单字节的读写没有问题。可是对多字节连续读写,发现 数组中的偶数都丢失为0 了。
void EEPROM_Write_Byte(unsigned int uiAddress, unsigned char ucData)
{

/* 等待上一次写操作结束 */

while(EECR & (1<<EEWE))

;

/* 设置地址和数据寄存器*/

EEAR = uiAddress;

EEDR = ucData;

/* 置位EEMWE */

EECR |= (1<<EEMWE);

/* 置位EEWE 以启动写操作*/

EECR |= (1<<EEWE);

asm("nop");
asm("nop");asm("nop");
asm("nop");
}
//指定地址和指定数组写n个数据
void EEPROM_Write_Nbyte(unsigned int src_addres, unsigned int *dst_addres,unsigned char num)
{ unsigned char i=0;

for(i=0;i<num;i++)

{

EEPROM_Write_Byte((src_addres+i),*(dst_addres+i));



}

}
unsigned char EEPROM_Read_Byte(unsigned int uiAddress)
{

/* 等待上一次写操作结束 */

while(EECR & (1<<EEWE))

;

/* 设置地址寄存器*/

EEAR = uiAddress;

/* 设置EERE 以启动读操作*/

EECR |= (1<<EERE);

/* 自数据寄存器返回数据 */

asm("nop");
asm("nop");asm("nop");
asm("nop");

return EEDR;
}
//读n个数据,从源地址中读n个字节到目的数组
void EEPROM_Read_Nbyte(unsigned int src_addres, unsigned int *dst_addres,unsigned char num)

{unsigned char i;

for(i=0;i<num;i++)

{

*(dst_addres+i)=EEPROM_Read_Byte((src_addres+i));

asm("nop");
asm("nop");asm("nop");
asm("nop");

}

}

int main(void)
{

uchar i;

uchar Read_Buff[8] = {0,0,0,0,0,0,0,0};  //读取数据缓冲区

uchar Write_Buff[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //写入数据缓冲区

EEPROM_Write_Byte(0x0a,0x02);//仅写一个数据

i=EEPROM_Read_Byte(0x0a);

Uart_Init(9600);//初始化串口

Uart_SendB(i+48);

Uart_Senddata_Changeline();//屏幕换行


EEPROM_Write_Nbyte(0x00,Write_Buff,8);

EEPROM_Read_Nbyte(0x00,Read_Buff,8);

for(i=0;i<8;i++)

{

Uart_SendB(*(Read_Buff+i)+48);//显示数字


_delay_ms(500);

Uart_Senddata_Changeline();//屏幕换行


}



Uart_SendB('a');
Uart_SendB('a');
Uart_SendB('a');
Uart_SendB('a');

while(1)

{





}                                 



}

eeprom_selfdesign.jpg (147.21 KB )

eeprom_selfdesign.jpg

相关帖子

沙发
selfstudy|  楼主 | 2011-7-29 21:43 | 只看该作者
??????????????????????

使用特权

评论回复
板凳
selfstudy|  楼主 | 2011-7-29 22:12 | 只看该作者
单个的读发现,错在 多字节写上面,可是找不到原因。

使用特权

评论回复
地板
ljhtj| | 2011-7-30 09:12 | 只看该作者
多点延时试试

使用特权

评论回复
5
selfstudy|  楼主 | 2011-7-30 09:34 | 只看该作者
4# ljhtj 谢谢!

关键是找不到原因,这个最郁闷了。

使用特权

评论回复
6
selfstudy|  楼主 | 2011-7-30 10:34 | 只看该作者
多字节的读写都存在问题,传递的数组有问题一样。只能间隔读写。

../eeprom_use_uarth.c:139: warning: passing argument 2 of 'EEPROM_Write_Nbyte' from incompatible pointer type

使用特权

评论回复
7
selfstudy|  楼主 | 2011-7-30 10:36 | 只看该作者
for(i=0;i<8;i++)
{
        temp=0x00+i;
        EEPROM_Write_Byte(temp,Write_Buff[i]);//仅写一个数据
        _delay_ms(5);
        Read_Buff[i]=EEPROM_Read_Byte(temp);

}
这样不采用传递地址的方式又是可行的。读写都没有问题,将多字节读写封装后就不行了。。

使用特权

评论回复
8
selfstudy|  楼主 | 2011-7-30 10:38 | 只看该作者
void EEPROM_Write_Byte(unsigned int uiAddress, unsigned char ucData)
{
        SREG&=~_BV(7);//先关中断
        /* 等待上一次写操作结束 */
        while(EECR & (1<<EEWE))
        ;
        /* 设置地址和数据寄存器*/
        EEAR = uiAddress;
        EEDR = ucData;
        /* 置位EEMWE */
        EECR |= (1<<EEMWE);
        /* 置位EEWE 以启动写操作*/
        EECR |= (1<<EEWE);
//        asm("nop");        asm("nop");asm("nop");        asm("nop");
        _delay_ms(10);
        SREG|=_BV(7);//开中断}
//指定地址和指定数组写n个数据
void EEPROM_Write_Nbyte(unsigned int  src_addres, unsigned int *dst_addres,unsigned char num){ unsigned char temp,i;        for(i=0;i<num;i++)
        {        temp=*(dst_addres+i);                EEPROM_Write_Byte( src_addres+i,temp);                 
        }
多字节封装写,存在什么问题。为什么 ../eeprom_use_uarth.c:139: warning: passing argument 2 of 'EEPROM_Write_Nbyte' from incompatible pointer type
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

84

帖子

2

粉丝