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访问会慢很多,这个是否可以通过什么修改配置的方法解决
Shine:
SPI0: org = 0x21805400 len = 0x00000200CREGISTER=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));
Liven Deng:
回复 Shine:
感谢您的帮助
按照这个建议做了修改,现在通过constant table已经可以读到SPI的SPIREV寄存器的内容,constant table和global地址方式操作的结果一致了,但是SPI寄存器写还是有问题
在PRU里面要对SPI寄存器写操作,是否需要配置,我这边有什么可以检查一下?
Shine:
回复 Liven Deng:
写操作具体是什么问题?
Yong Yang:
回复 Shine:
就是属性是W/R的SPI寄存器写不进去,如对SPIGCR0写1,写完回读一直是0,但是我试相同的方式写UART的寄存器是可以写进去的
SPI寄存器我在ARM中写是可以的,但是在PRU中对SPI的寄存器写操作就写不了,通过constant table和物理地址操作都是一样现象
TI中文支持网