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.

AM5728 PCIe访问设备的I/O空间的数据宽度问题



在TRM的24.9.4.8.3.1中提到:
Initiators in the RC host (typically a local CPU) can then access I/O space by initiating (1 DWORD) read/write accesses to the ATU region’s range on the controller’s slave port on L3_MAIN. 
从字面意思看,作为RC访问(读或者写)设备的IO空间,需要按照DWORD进行,不知道是否有这个限制?

  • 是的,按照手册来。

  • 最近学习PCIe,外设使用了一款简单的PCIe转串口的芯片CH382,基于PCIE_idkAM572x_wSoCFile_armExampleProject例程修改的,由于对PCIe不是很熟悉,出现了一些问题,还请指点一二。具体代码如下:
      pcieConfigBase = (char *)pcieBase + PCIE_WINDOW_CFG_BASE;    //CH382配置空间基地址

      *(uint32_t *)((char *)pcieConfigBase + 0x10) = 0x70000000;                 //设置CH382中IO基地址,RC初始化时,将IO空间映射到了0x70000000
      *(uint32_t *)((char *)pcieConfigBase + 0x04) = 0x00000003;                 //cmd寄存器,使能mem和io空间访问

      pcieIOBase = (char *)pcieBase + PCIE_WINDOW_MEM_BASE;         //CH382设备IO空间对应的CPU物理地址,0x21000000

      reg_value = *(uint32_t *)((char *)pcieIOBase + 0x0C);                          //读取CH382IO空间中的寄存器,发现全是FF,实际上应该大部分是0,部分是1

      *((char*)pcieIOBase + 0xC0 + LCR) = 0x80;
      *((char*)pcieIOBase + 0xC0 + DLL) = 0x0C;
      *((char*)pcieIOBase + 0xC0 + DLM) = 0x00;
      *((char*)pcieIOBase + 0xC0 + LCR) = 0x03;
      *((char*)pcieIOBase + 0xC0 + FCR) = 0x01;
    上述代码,主要功能是设置CH382的波特率,设置校验、停止位等,开启fifo等。

          *((char*)pcieIOBase + 0xC0) = i;//向发送寄存器写数据
    以上代码IO空间除了第一次读取4个寄存器外,都是按照char访问的,也实现了数据发送,波特率等也是对的,但是按照char来访问lSR寄存器,得到的值是不对的
    比如
      reg_value = *((char*)pcieIOBase + 0xC0 + LSR);
    这中访问形式,读到的状态一直是0xFF。
    如果按照4字节对齐访问进行初始化:
      *(uint32_t *)((char*)pcieIOBase + 0xC0) = 0x80000000;
      *(uint32_t *)((char*)pcieIOBase + 0xC0) = 0x8000000C;
      *(uint32_t *)((char*)pcieIOBase + 0xC0) = 0x0300000C;
      *(uint32_t *)((char*)pcieIOBase + 0xC0) = 0x03010000;
    *(uint32_t *)((char*)pcieIOBase + 0xC0 + 0) = i + 0x03010000;
    数据也能发送,但波特率是不对的,没有按照预想的波特率发送。
    由于对PCIe不熟悉,目前很难进一步查找原因,请提供一些建议,多谢!