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.

66K2G12 PRU通过constant table访问不了SPI

Hi

我这边在使用K2GEVM进行一些软件的前期验证,遇到一个PRU访问SPI寄存器的问题需要请教一下

 

我们在K2GEVM的demo板上做了一些实验,发现PRU通过constant table访问不了SPI,读和写都不行,而通过global地址来访问,只能读,写仍然写不进去

下面是我的PRU工程中用到的cmd配置

         MMC0                       : org = 0x23000000 len = 0x00000300   CREGISTER=5

         SPI0                            : org = 0x21805400 len = 0x00000200   CREGISTER=6

…………………………

         SPI1                            : org = 0x21805800 len = 0x00000200   CREGISTER=16

         I2C_1                         : org = 0x02530400 len = 0x0000003C   CREGISTER=17

在我的test code中对应定义了SPI

volatile __far pruSpi CT_SPI0 __attribute__((cregister("SPI0", near), peripheral));

volatile __far pruSpi CT_SPI1 __attribute__((cregister("SPI1", near), peripheral));

 

1)       通过constant table的方式访问

ulTmp = CT_SPI1.SPIREV;                          读不到SPIREV的内容

 

    CT_SPI1.SPIGCR0 = 1;

    ulTmp = CT_SPI1.SPIGCR0;                       回读仍是0,看PRU的临时变量和从ARM侧看SPI寄存器都是这样

 

    CT_UART1.IER = 0x0c;

    ulTmp = CT_UART1.IER;                            UART通过constant table访问,读写都是正常的

 

2)       通过global方式

ulTmp = REG(SPI2_GCR0 + 0x1FC);          可以读到SPIREV的内容

 

REG(SPI2_GCR0) = 1;

ulTmp = REG(SPI2_GCR0);                        回读仍是0,看PRU的临时变量和从ARM侧看SPI寄存器都是这样

 

请帮忙看看这个是什么原因,是否我有什么配置可以再检查一下,我使用的测试环境是K2GEVM的demo板,上面是K2G02

 

另外从芯片资料中了解到,PRU可以通过内部的constant table访问,但只能访问SPI0/1,SPI2/3只能通过global 的方式访问,但是访问效率比通过constant table访问会慢很多,这个是否可以通过什么修改配置的方法解决

  • SPI0 : org = 0x21805400 len = 0x00000200 CREGISTER=6

    cmd文件 len = 0x00000200大于x100, 把 cregister里near改成far试试。

    volatile __far pruSpi CT_SPI0 __attribute__((cregister("SPI0", far), peripheral));

    volatile __far pruSpi CT_SPI1 __attribute__((cregister("SPI1", far), peripheral));
  • 感谢您的帮助

    按照这个建议做了修改,现在通过constant table已经可以读到SPI的SPIREV寄存器的内容,constant table和global地址方式操作的结果一致了,但是SPI寄存器写还是有问题

     

    在PRU里面要对SPI寄存器写操作,是否需要配置,我这边有什么可以检查一下?

  • 写操作具体是什么问题?
  • 就是属性是W/R的SPI寄存器写不进去,如对SPIGCR0写1,写完回读一直是0,但是我试相同的方式写UART的寄存器是可以写进去的
    SPI寄存器我在ARM中写是可以的,但是在PRU中对SPI的寄存器写操作就写不了,通过constant table和物理地址操作都是一样现象