有注册地址(第一个?)SPI1号。
有偏移的结构我想这意味着
SPI1_REG_BASE+offset=某个SPI注册表的地址

#define SPI1_REG_BASE         (0x01F0E000)
//-----------------------------------------------------
//Register Structure & Defines
//-----------------------------------------------------
typedef struct
{
  volatile uint32_t SPIGCR0;        // 0x0000
  volatile uint32_t SPIGCR1;        // 0x0004
  volatile uint32_t SPIINT;         // 0x0008
  volatile uint32_t SPILVL;         // 0x000C
  volatile uint32_t SPIFLG;         // 0x0010
  volatile uint32_t SPIPC0;         // 0x0014
  volatile uint32_t SPIPC1;         // 0x0018
  volatile uint32_t SPIPC2;         // 0x001C
  volatile uint32_t SPIPC3;         // 0x0020
  volatile uint32_t SPIPC4;         // 0x0024
  volatile uint32_t SPIPC5;         // 0x0028
  volatile uint32_t RSVD0[3];       // 0x002C
  volatile uint32_t SPIDAT0;        // 0x0038
  volatile uint32_t SPIDAT1;        // 0x003C
  volatile uint32_t SPIBUF;         // 0x0040
  volatile uint32_t SPIEMU;         // 0x0044
  volatile uint32_t SPIDELAY;       // 0x0048
  volatile uint32_t SPIDEF;         // 0x004C
  volatile uint32_t SPIFMT0;        // 0x0050
  volatile uint32_t SPIFMT1;        // 0x0054
  volatile uint32_t SPIFMT2;        // 0x0058
  volatile uint32_t SPIFMT3;        // 0x005C
  volatile uint32_t INTVEC0;        // 0x0060
  volatile uint32_t INTVEC1;        // 0x0064
} spi_regs_t;

有一些定义和指针*spi的定义
#define CSDEF0 (0x00000001) //bit 0
#define CSHOLD (0x10000000) //bit 28
spi_regs_t *spi = (spi_regs_t *)SPI1_REG_BASE;

我误解了比特的设置例如,
spi->SPIDEF |= CSDEF0 //set 0 bit in the registry field

我知道SPIDEF是一个SPI寄存器,它有偏移地址4Ch
(0x01F0E000+0x4C)但为什么CSDEF0是位0??SPIDEF注册表中有一个字段CSDEF(0-7位)是否意味着7位CSDEF有地址0x000000085位有地址0x00000006?
但为什么SPIDAT1注册表的CSHOLD字段有地址0x10000000??
spi->SPIDAT1 |= CSHOLD  //set bit 28

SPIDAT1寄存器具有偏移地址3Ch(0x01F0E000+0x3C)
它确实有字段CSHOLD(28位)
在这种情况下|=如何工作?
如果你能帮我找出所有这些)

最佳答案

但为什么CSDEF0是位0??
此宏的目的是将位0设置为1如果该宏与任何寄存器为“或”,则该寄存器的位-0设置为1。
例如
spi->SPIDEF = 0x050A即0x050A==>0000 0101 0000 1010
现在使用CSDEF0设置第0位spi->SPIDEF。

0x050A     ==> 0000 0101 0000 1010
CSDEF0     ==> 0000 0000 0000 0001
               --------------------

spi->SPIDEF ==> 0000 0101 0000 1011
为什么SPIDAT1注册表的CSHOLD字段有地址0x10000000??
与CSDEF0表示第0位的方式相同,CSHOLD用于第28位。
我猜你把0x000001和000001的十六进制和二进制表示搞混了吧???).
0x01 is 01.
0x02 is 10.
0x100 is 1 0000 0000
0x1000 is 1 0000 0000 0000
0x10000000 is 1 0000 0000 0000 0000 0000 0000 0000
              ^-- Bit 28 starting from bit-0

09-15 22:30