| |
Registers/Specification
连接到主处理器的硬件功能块通过存储器映射寄存器进行管理。这意味着软件地址映射中的每个位对应于硬件触发器。为了控制硬件并与之交互,软件必须读取和写入寄存器,因此使用抽象(称为硬件 - 软件接口或寄存器描述)来组织寄存器描述。
该硬件 - 软件接口将I / O存储器映射中的地址分配给由助记符标识的寄存器。然后可以将每个寄存器分解成域,或者再次给予助记符的各个位组。域可以只是一个比特,也可以与寄存器位宽本身一样宽。每个域可以具有不同的访问属性,例如,它可以是只读,只写,读写或读取时清除。寄存器可以具有保留域,换言之,寄存器中的位未被使用但可以在设计的未来版本中使用。以下是寄存器描述示例 - 来自SPI主控DUT的控制寄存器:
【此处省略一张表】
对于给定的功能块,可能存在多个寄存器,并且每个寄存器将具有从块的基地址偏移的特定地址。要访问寄存器,处理器将对其地址进行读或写操作。软件工程师使用寄存器映射来确定如何编程硬件设备,他可能会使用一组define语句将寄存器名称和字段名称映射到头文件中的数值,以便他可以在更抽象的级别工作细节。例如,如果他希望在SPI主控制器中启用中断,则可以从CTRL读取,然后使用IE对该值进行“或”运算,然后将结果值写回CTRL:
spi_ctrl = reg_read(CTRL);
spi_ctrl = spi_ctrl | IE;
reg_write(CTRL, spi_ctrl);
SPI主控制器的寄存器地址映射如下表所示。注意,控制寄存器与参考SPI主基地址来看的偏移地址为0x10。
SPI Master Register Address Map
【此处省略一张表】
注:在SPI主控制器中,RXn和TXn寄存器实际映射到相同的硬件触发器上,在字符发送和接收期间,它们的内容会发生变化。因此,从软件接口抽象中,TX寄存器是只写的,并且RX寄存器是只读的,并且Rx内容仅在字符传输结束时有效。
如果SPI主设备集成到更大的设计中,则SPI主设备的基地址将发生变化,软件工程师通过更新其头文件来保护自己免受该更改的影响,但底层固件代码无需更改。