This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6713 EMIF总线访问经常出现收发数据不正确。

DSP EMIF总线CS0连接 FPGA, CS1连接 Flash。总线宽度均为16BIT,小端方式,100MHZ,DSP为主, CCS3.3开发坏境

 1、EMIF CS0 访问,使用 memcpy()函数往从设备端发送数据,经常从设备端收到数据只有低字节数据正确,高字节错误的情况,如发送数据为0x2211,FPGA收到  的数可能会变成 0x1111,但不是每次都错。改用自己写的mycpy就正常了。这是为什么?

inline void mycpy(void *dest, const void *src, int len)
{
   const unsigned short *s = src;
   unsigned short *d = dest;

   while (size--) {
      *d++ = *s++;
   }
}

2、EMIF CS1连接了 FLASH芯片,带DSP/BIOS情况下,在main函数中读取FLASH正常,偶尔会出现读取FLASH固定地址数据错误(在DSP 使用CCS打断点调试时,FPGA发送中断信号给DSP,随后DSP继续执行准备读取FLASH的情况下),每次错误时读到数据都为0x004F000F,再次读取才会正常。但是使用不带操作系统的工程测试该段地址一直都正常。

  • Mr.a.mike 说:
    1、EMIF CS0 访问,使用 memcpy()函数往从设备端发送数据,经常从设备端收到数据只有低字节数据正确,高字节错误的情况,如发送数据为0x2211,FPGA收到  的数可能会变成 0x1111,但不是每次都错。改用自己写的mycpy就正常了。这是为什么?

    估计你的FPGA对EMIF上的信号固定按16bit方式来识别了。memcpy是按char型的访问,而你的mycpy是按short(16-bit)型的访问。顺着这个思路去查一下吧。

    Mr.a.mike 说:
    2、EMIF CS1连接了 FLASH芯片,带DSP/BIOS情况下,在main函数中读取FLASH正常,偶尔会出现读取FLASH固定地址数据错误(在DSP 使用CCS打断点调试时,FPGA发送中断信号给DSP,随后DSP继续执行准备读取FLASH的情况下),每次错误时读到数据都为0x004F000F,再次读取才会正常。但是使用不带操作系统的工程测试该段地址一直都正常。

    在于main里就来中断了?这时中断还没使能呢。

  • 问题1、Emif总线按我的理解,不应该是当我把EMIF配置成16BIT位宽的时候,由DSP EMIF器件把memcpy的每次1字节数据拼接成16BIT后再发送吗?看你的回答,似乎意思是这个是由对端完成的。那我使用memcpy从FPGA接收数据正常是因为DSP可以识别8/16BIT方式吗?

    问题2、断点停在任务里,中断也是在任务中打断点时间发生的。这个任务属于最高优先级。只要FPGA没有发送过中断,FLASH访问就很正常。

                 a) 在出错的情况下,我使用不带操作系统的工程访问FLASH这段地址完全正常,是否可以证明EMIF总线状态正常?没有发生总线竞争?

                 b) 这个现象是否与DSP/BIOS中 Cache功能的配置有关?C6713 是否默认是对EMIF地址空间进行Cache的?

                 c) 我在使用带DSPBIOS的情况下偶尔读错是不是可能是因为这时总线被cache,访问FLASH的操作没有真的发生,其实读取的数据来自Cache?而非Flash真实数据?

  • Mr.a.mike 说:
    Emif总线按我的理解,不应该是当我把EMIF配置成16BIT位宽的时候,由DSP EMIF器件把memcpy的每次1字节数据拼接成16BIT后再发送吗?

    不会拼的,如果只访问一字节怎么办?是由Byte Eanble BE0-BE3来控制哪个字节是有效的,如果是按BYTE访问,则只会有一个BE0有效,如果是按16bit访问则BE0与BE1会同时有效。

    Mr.a.mike 说:
    这个现象是否与DSP/BIOS中 Cache功能的配置有关?C6713 是否默认是对EMIF地址空间进行Cache的?

    这要看你在BIOS里怎么配置的了,默认是不被CACHE的。查看相应的MARn寄存器看有没有使能Cacheable.

  • 对了,FPGA里不是有抓时序与数据的功能吗,你抓一下看就更直观了。

  • 嗯,问题1 原来是和FPGA通信失败时,在FPGA那端数据仿真抓取看到的。DSP与FPGA之间没做字节选通。

    问题2,DSP/BIOS配置选项里,"Global Settings属性"里我把"621x/671x"里"621x/671x-Configure L2 Memory Settings"选项给去掉了(原因是原来使用EMIF给FPGA加载程序时,显示波发现EMIF总线上啥也没有,一个字节数据都没有拍出去。去掉这个选项后,FPGA才加载成功的)。

  • 勾不勾应该不是主要的,关键是下面L2 MAR0-15的配置才会影响是否Cache。

  • 问题2最后定位到其实是我代码写的有问题,多任务读写Flash时出现问题的,其中一个低优先级任务写到一半的时候,被高优先级任务打断开始读Flash,然后读数就错了。

    汗颜。

    BUT当我把Flash读写函数添加互斥锁后,结果给挂死了。看互斥锁的结构体,里面居然还有任务句柄的参数,看样子似乎互斥锁不支持多个任务共用一把锁啊。看来我应该看看DSPBIOS用户手册,了解下具体信息了。之前想当然的以为它就是一个只有一个资源的信号量了。