打印
[PIC®/AVR®/dsPIC®产品]

跟大家请教一下 18f25k80 的 eeprom读写问题

[复制链接]
2309|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengleigood|  楼主 | 2021-2-26 22:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fengleigood 于 2021-2-26 22:24 编辑

小弟因为需要用到CAN  所以从目前用的16f 改换并学习了18f
目前使用18f25k80 的can模块工作良好

不过倒出现一个意想不到的事  就是EEPROM存储不住的问题? 我想大多应该是自己这个新手的问题
按理说EEPROM的使用再简单不过了  我放上来一段汇编大家帮我看看毛病可能出现在哪里
写:
        movlw        000h
        movwf        eeadrh,0
        movlw        000h             ;写入存储地址和待写入数据
        movwf        eeadr,0
        movlw        034h
        movwf        eedata,0

        bcf                eecon1,7,0     ;选择EEPROM
        bcf                eecon1,6,0     ;选择对ROM操作
        bsf                eecon1,2,0     ;打开写允许

        bcf                gie
        movlw        55h
        movwf        eecon2,0       ;关闭中断并输入写序列 55 aa
        movlw        0aah
        movwf        eecon2,0

        bsf                eecon1,1,0    ;启动写操作

loop_wr
        btfsc        eecon1,1,0
        goto        loop_wr
        bcf                eecon1,2,0    ;等待写启动位清零 然后关闭写允许  开启中断  清零写完成中断标志位

        bsf                gie
        bcf                eeif


读:


        movlw        000h
        movwf        eeadrh,0
        movlw        000h             ;输入要读的地址
        movwf        eeadr,0

        bcf                eecon1,7,0     ;选择EEPROM
        bcf                eecon1,6,0     ;选择对ROM操作
        bsf                eecon1,0,0     ;开启读操作

        nop
        nop                                ;多等待两个周期
        movff        eedata,txreg1  ;将读出数据直接串口发送


一开始我只是单独放入写程序  烧写过后   再删除写程序 单独放入一段读程序  以为上次烧录之后就写好了
这次再让读程序一遍遍的读出并送到串口   结果输出的都是0XFF 没有数据的感觉

之后 我把写程序放在上电初始化程序的末尾  不在程序循环中 只上电运行一次
然后在频率最低的定时循环中(每秒运行31次 )放入读程序    结果输出了0X34
就是前面写入的数据 后来又改为 对00写入34 对01写入56   读出程序 也循环输出0X34 0X56

我挺高兴 以为那里弄错了 自己改好了  结果删除了上电初始化那里的写入程序    后面的读出程序
就又继续发送0XFF了

按我的能力 当前只能分析出  这25k80的EEPROM 居然断电之后无法保持?存储不住?
重新上电之后就都没有了?  只有上电初始化的时候先写一遍  然后在不掉电之前 才可以正常读出数据?
我只是想这么问问 有点恼火。。。 但一定还是自己的问题   上次我问的那个16f883的2K程序的事  
其实那个项目里也有用到EEPROM  但一切正常。。 不知道这次自己的程序又出了什么鬼火

望大家不吝赐教。。。这事挺挠头的  还着急出样品。。。 先谢谢大家了

使用特权

评论回复
沙发
fengleigood|  楼主 | 2021-2-26 23:25 | 只看该作者
本帖最后由 fengleigood 于 2021-2-26 23:30 编辑

对了 这里有OLDE的 SH1106的驱动程序  后面从一半的空间也就是org 4000h 开始存储显示数据 大概有3K左右  这不应该干扰EEPROM吧  
另外 说是不用考虑程序页面的事  确实完全不用考虑吗 还是有的地方还是要注意 和调整的?
还有就是 CAN的使用 应该也不会影响EEPROM吧我还傻呵呵的认为是否自己买的25k80有问题  测试了一起买来的46k80  66k80 结果完全一个效果  其他程序正常运行CAN工作, 屏幕正常显示 就EEPROM存不住。。
我一直在想   出门散散心 回来还是在想  看手册 检查自己初始化程序  和其他程序是否有错定义之类的误操作到EEPROM  绞尽脑汁  还未解决

使用特权

评论回复
板凳
fengleigood|  楼主 | 2021-2-26 23:33 | 只看该作者

MCC生成的。
void DATAEE_WriteByte(uint16_t bAdd, uint8_t bData)
{
    uint8_t GIEBitValue = INTCONbits.GIE;

    EEADRH = ((bAdd >> 8) & 0x03);
    EEADR = (bAdd & 0xFF);
    EEDATA = bData;
    EECON1bits.EEPGD = 0;
    EECON1bits.CFGS = 0;
    EECON1bits.WREN = 1;
    INTCONbits.GIE = 0;     // Disable interrupts
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1;
    // Wait for write to complete
    while (EECON1bits.WR)
    {
    }

    EECON1bits.WREN = 0;
    INTCONbits.GIE = GIEBitValue;   // restore interrupt enable
}

uint8_t DATAEE_ReadByte(uint16_t bAdd)
{
    EEADRH = ((bAdd >> 8) & 0x03);
    EEADR = (bAdd & 0xFF);
    EECON1bits.CFGS = 0;
    EECON1bits.EEPGD = 0;
    EECON1bits.RD = 1;
    NOP();  // NOPs may be required for latency at high frequencies
    NOP();

    return (EEDATA);
}

这是人家用C的 自动生成的  我虽然不会用C  但也都看明白了步骤  跟我的一样没有区别    究竟哪里出了问题呢。。。

使用特权

评论回复
地板
bb688| | 2021-2-27 07:56 | 只看该作者
操作延时过短会出现这种情况,改改看

使用特权

评论回复
5
fengleigood|  楼主 | 2021-2-27 09:19 | 只看该作者
本帖最后由 fengleigood 于 2021-2-27 09:21 编辑
bb688 发表于 2021-2-27 07:56
操作延时过短会出现这种情况,改改看

您的意思 是读操作过后 读取EEDATA寄存器之前的延时吗
手册里面说只用一个NOP就可以  而我后来的测试中 曾经加了几十个NOP 也还是这个效果

而且  如果上电的时候 执行了一次对EEPROM 00  01进行 34h 56h的赋值
之后在程序循环中我读取00 01这两个地址  就可以读出来 34   56

好像不是读取的问题?能不能是其他的操作造成的EEPROM工作不正常 甚至硬件的设计问题?
或者配置字里面的设置呢

使用特权

评论回复
6
cooldog123pp| | 2021-2-27 16:00 | 只看该作者
不懂,但是路过了就帮楼主顶一下,希望有高手能帮忙解决问题!我们正好也学习一下。

使用特权

评论回复
7
fengleigood|  楼主 | 2021-2-27 21:03 | 只看该作者
cooldog123pp 发表于 2021-2-27 16:00
不懂,但是路过了就帮楼主顶一下,希望有高手能帮忙解决问题!我们正好也学习一下。 ...

谢谢!!

今天我考虑到是否用16M倍频到64M 速度过快问题。。 降频看看 问题依旧  还有就是写完之后用判断EEIF的方式来结束写程序   问题还是依旧  实在不行  帖一片93c46吧

使用特权

评论回复
8
m564522634| | 2021-2-27 21:43 | 只看该作者
你的eeprom是外置的还是内置的,这个不一定是程序的问题。

使用特权

评论回复
9
fengleigood|  楼主 | 2021-2-27 22:54 | 只看该作者
本帖最后由 fengleigood 于 2021-2-27 22:55 编辑
m564522634 发表于 2021-2-27 21:43
你的eeprom是外置的还是内置的,这个不一定是程序的问题。

我的是 18f25k80内置的  我一楼写的这点程序 其实就是按照手册上面执行的  另外跟别人的用MCC生成的 也相同

使用特权

评论回复
10
Woo0o| | 2021-2-27 22:57 | 只看该作者
18f25k80内置的  按照手册写的,这里应该没问题、

使用特权

评论回复
11
fengleigood|  楼主 | 2021-2-27 23:06 | 只看该作者
是的啊

使用特权

评论回复
12
m564522634| | 2021-2-28 19:21 | 只看该作者

不是你本身读写程序的问题,我怀疑是不上电后启动代码有初始化EEPROM的操作,验证这个猜想你可以不断电复位单片机,如果不断电复位单片机后EEPROM还有数据那说明是硬件的问题,如果你复位后数据没有了,那就是你代码的问题,这个要从启动文件,配置位查起。看不看有没有操作到 EEPROM

使用特权

评论回复
13
fengleigood|  楼主 | 2021-3-1 08:47 | 只看该作者
本帖最后由 fengleigood 于 2021-3-1 08:51 编辑
m564522634 发表于 2021-2-28 19:21
不是你本身读写程序的问题,我怀疑是不上电后启动代码有初始化EEPROM的操作,验证这个猜想你可以不断电复 ...

哦哦好的  谢谢朋友  我回头测试一下!! 把复位管脚配置回复位功能

使用特权

评论回复
14
fengleigood|  楼主 | 2021-3-1 08:57 | 只看该作者
m564522634 发表于 2021-2-28 19:21
不是你本身读写程序的问题,我怀疑是不上电后启动代码有初始化EEPROM的操作,验证这个猜想你可以不断电复 ...

另外这18F 如果我不用任何模块的话 也应该是上电只需要把有模拟功能的IO配置为数字IO  就可以正常使用了吧   
不用其他的特殊的初始化?

使用特权

评论回复
评论
ayfalcon 2021-3-10 22:16 回复TA
用上面模块配置什么模块,不用就不要管了,默认就行 
15
CoolSilicon| | 2021-3-1 10:18 | 只看该作者
1. EEPROM写完了之后, 需要有个大约5ms的延迟, 来完成整个写入操作, 这个datasheet上是有明确说明的.
简单的说,就是写入EEPROM之后,至少要等5ms才能去读,  后续的读操作不受这个延迟影响.
2. 如果在一上电就写入EEPROM的话, 建议使能芯片的BOR功能..不然可能会有很多异常.

3.EEPROM是很成熟的技术, 不用怀疑是硬件的问题...一定是你软件, 时许/地址之类的, 哪里没处理好..

使用特权

评论回复
16
fengleigood|  楼主 | 2021-3-1 13:34 | 只看该作者
CoolSilicon 发表于 2021-3-1 10:18
1. EEPROM写完了之后, 需要有个大约5ms的延迟, 来完成整个写入操作, 这个datasheet上是有明确说明的.
简单 ...

谢谢!!多谢指点 我尝试一下  !

使用特权

评论回复
17
fengleigood|  楼主 | 2021-3-7 12:07 | 只看该作者
哎。。还是没找到问题 我现在暂时贴了一片96c46.。

使用特权

评论回复
评论
ayfalcon 2021-3-10 22:18 回复TA
PIC的EEPROM是不会出问题的。你还是看看你的软件吧!! 
18
ayfalcon| | 2021-3-10 22:28 | 只看该作者
对汇编我不怎么太熟悉,这个是在一个 现成的程序里摘出来的。供你参考。
写:         MOVLW   2BH         
         MOVWF   EEADR
         MOVF    2BH,W        
         MOVWF   EEDATA
         NOP
         NOP
         BCF     PIR2,EEIF     ;
         BCF     EECON1,EEPGD  ;
         BCF     EECON1,CFGS
         BSF     EECON1,WREN
         BCF     INTCON,7      ;
         BCF     INTCON,6
         MOVLW   55H
         MOVWF   EECON2
         MOVLW   0AAH
         MOVWF   EECON2
         BSF     EECON1,WR
         NOP



读:         MOVLW   2BH
         MOVWF   EEADR         ;
         NOP
NOP
         BCF     EECON1,CFGS
         BCF     EECON1,EEPGD  ;
         BSF     EECON1,RD     ;
         NOP
         NOP
         NOP
         NOP
         BSF     EECON1,EEPGD  ;
         NOP
         MOVF    EEDATA,W      ;
         MOVWF   2BH

使用特权

评论回复
评论
ayfalcon 2021-10-25 22:06 回复TA
@fengleigood :eeprom你成功了没有 
fengleigood 2021-3-20 20:13 回复TA
谢谢! 我去试试看 
19
xinpian101| | 2021-3-12 22:51 | 只看该作者
不懂汇编。。。。。。。。。。

使用特权

评论回复
20
奔波儿熊| | 2021-3-24 16:45 | 只看该作者
MCC 都生成了, 为什么不试一下

使用特权

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

本版积分规则

2

主题

20

帖子

0

粉丝