打印
[技术问题解答]

MCF5441中SPI写内存失败的疑问

[复制链接]
1528|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MCF54418|  楼主 | 2014-4-24 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
您好:

我在54418板上,用spi0在地址0x0000F0处,写入0xBA,读取时为0xFF。代码如下:
//************************************************************
        MQX_FILE_PTR fpSPI0 = NULL;
        uchar ucSendBuffer[1 + 3 + 0x0100] = {0};
        int si32Ret = 0;
        uint_8 u8Status = 0;
        uint_8 u8Data = 0;
        //************************************************************
        fpSPI0 = fopen("spi0:", NULL);
        if        (NULL == fpSPI0) {
                printf("ERROR: EGUI_LCDInit(): open SPI0 failed.\n");
                return;
        }
        //************************************************************
        //开启锁存器,以允许内存读写
        ucSendBuffer[0] = 0x06;
        si32Ret = fwrite(ucSendBuffer, 1, 1, fpSPI0);
        fflush(fpSPI0);
        if        (1 != si32Ret) {
                printf("ERROR: EGUI_LCDInit(): SPI0 set latch failed.\n");
                return;
        }
       
        //读取内存状态
        ucSendBuffer[0] = 0x05;
        si32Ret = fwrite(ucSendBuffer, 1, 1, fpSPI0);
        if        (1 != si32Ret) {
                printf("ERROR: EGUI_LCDInit(): SPI0 write read status command failed.\n");
                return;
        }
        si32Ret = fread(&u8Status, 1, 1, fpSPI0);    //【读到的状态为0xFF】
        fflush(fpSPI0);
        if        (1 != si32Ret) {
                printf("ERROR: EGUI_LCDInit(): SPI0 read status failed.\n");
                return;
        }
       
        //向指定内存地址写入数据
        ucSendBuffer[0] = 0x02;
        ucSendBuffer[1] = ((0x0000F0 >> 16) & 0xFF);
        ucSendBuffer[2] = ((0x0000F0 >>  8) & 0xFF);
        ucSendBuffer[3] = ((0x0000F0 >>  0) & 0xFF);
        ucSendBuffer[4] = 0xBA;    //【要写入的数据0xBA】
        si32Ret = fwrite(ucSendBuffer, 1, (1 + 3 + 1), fpSPI0);    //【返回值确实为5】
        fflush(fpSPI0);
        if        ((1 + 3 + 1) != si32Ret) {
                printf("ERROR: EGUI_LCDInit(): SPI0 write data failed.\n");
                return;
        }
        _time_delay(5);
        //************************************************************
        //读取内存状态
        ucSendBuffer[0] = 0x05;
        si32Ret = fwrite(ucSendBuffer, 1, 1, fpSPI0);
        if        (1 != si32Ret) {
                printf("ERROR: EGUI_LCDInit(): SPI0 write read status command failed.\n");
                return;
        }
        si32Ret = fread(&u8Status, 1, 1, fpSPI0);    //【读到的状态为0xFF】
        fflush(fpSPI0);
        if        (1 != si32Ret) {
                printf("ERROR: EGUI_LCDInit(): SPI0 read status failed.\n");
                return;
        }
        //************************************************************
        //从指定内存地址读取数据
        ucSendBuffer[0] = 0x03;
        ucSendBuffer[1] = ((0x0000F0 >> 16) & 0xFF);
        ucSendBuffer[2] = ((0x0000F0 >>  8) & 0xFF);
        ucSendBuffer[3] = ((0x0000F0 >>  0) & 0xFF);
        si32Ret = fwrite(ucSendBuffer, 1, (1 + 3), fpSPI0);
        if        ((1 + 3) != si32Ret) {
                printf("ERROR: EGUI_LCDInit(): SPI0 write read data command failed.\n");
                return;
        }
        si32Ret = fread(&u8Data, 1, 1, fpSPI0);    //【读到的数据位0xFF,不是0xBA???】
        fflush(fpSPI0);
        if        (1 != si32Ret) {
                printf("ERROR: EGUI_LCDInit(): SPI0 read data failed.\n");
                return;
        }

请高手指点……

相关帖子

沙发
FSL_TICS_ZJJ| | 2014-4-24 14:06 | 只看该作者
楼主,你这个问题还是MQX相关的对吗?
你之前发服务请求的SR,有人回你了吗?

使用特权

评论回复
板凳
MCF54418|  楼主 | 2014-4-24 14:26 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-24 14:06
楼主,你这个问题还是MQX相关的对吗?
你之前发服务请求的SR,有人回你了吗? ...

您好:
    1、对,这个是我从MQX目录下,看的SPI的一个例子,在板子上调试,发现写数据失败。
    2、之前发的SR,我没有注意SR序列号,所以不知道现在有人回复没有。不过,那个问题
经过优先级的调整后,我程序跑了6个小时,暂时不再报错了。测试人员还在做疲劳……

Best wishes

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2014-4-24 14:45 | 只看该作者
MCF54418 发表于 2014-4-24 14:26
您好:
    1、对,这个是我从MQX目录下,看的SPI的一个例子,在板子上调试,发现写数据失败。
    2、之 ...

SR号,你直接查看你的邮件就知道了。
你这个问题,我帮你问问MQX工程师,看他怎么讲,如果工作量比较大,可能还是要发SR,因为他主要是支持邮件方式的。您稍等下。

使用特权

评论回复
5
FSL_TICS_ZJJ| | 2014-4-24 15:07 | 只看该作者
楼主你好,你这个问题有发过SR吗?
现在MQX工程师只有一个,其他的都是国外的MQX工程师,并且最近在休假,要下周一上班。
所以,建议你把这个问题用英文发一个SR,这样下周国外的同事上班了会帮你解决。
发出来后,可以把SR号给我,我会帮你留意解决情况。

使用特权

评论回复
6
exel| | 2014-6-5 17:35 | 只看该作者
感觉原厂例程就是耽误青春, _time_delay(5);用上后怎么保证实时性,存个数据都要5ms现场还怎么用?0xff的返回值就是读取失败值,等于没有读成功。建议把flash手册好好看看,写页地址和缓存地址可能存在问题

使用特权

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

本版积分规则

12

主题

29

帖子

0

粉丝