最近工作中遇到一个问题,大致描述一下:
我们SOC用的arm cortex m7内核,在设计时设计人员图方便,将SPI controller的寄存器(即原本应该是APB空间)放在了0x60000000的某一块空间(此空间arm的memory定义区间为external memory),然后同时把SPI flash的存储空间也映射在了0x60000000的这一块区间内。后者将spi flash memory映射在此区间内其实时合理的。但是将spi controller的寄存器也放在这块空间,验证人员只验证了对寄存器的访问,是可以的,此时并没有发现什么问题。
说明一下,spi controller用的synopsis的design ware IP:SSI。
SSI要求在设置一些配置寄存器前必须先disable SSI模块,所以软件先对该寄存器设置,即对使能寄存器下disable=0,然后开始对一些配置寄存器对配置设定,比如位宽,clock divider等。注意有个前提,SOC powerup之后,使能寄存器默认是enable的。!所以还必须提前disable动作。
debug软件时发现,在disable后的第一个配置寄存器的设定总是写不进去!
后来通过验证simulation发现,在CPU出来的bus上,disable寄存器的设定竟然在第一个配置寄存器设定的后面,可是软件明明时先设定的disable。所以导致第一个配置寄存器的配置软件这边始终看不到生效!!!!
至于原因,我们猜测时arm cortex-m7 cpu认为0x60000000区域是external memory区域,再加上cm7支援乱序发射双发射等等因素,导致cpu往spi