レジストリ(最初?)SPI1のアドレスがあります。オフセットのある構造があります。SPI1_REG_BASE + オフセット = 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 - は、オフセット アドレス 4Ch
(0x01F0E000 + 0x4C) を持つ SPI レジスタであることがわかりました。しかし、なぜ CSDEF0 がビット 0 なのですか?? SPIDEF レジストリ (0 ~ 7 ビット) にはフィールド CSDEF があります。CSDEF の 7 ビットのアドレスが 0x00000008 ということですか? 5 ビットのアドレスは 0x00000006 ですか?
しかし、なぜ SPIDAT1 レジストリの CSHOLD フィールドのアドレスが 0x10000000 なのですか??
spi->SPIDAT1 |= CSHOLD //set bit 28
SPIDAT1 レジスタにはオフセット アドレス 3Ch (0x01F0E000 + 0x3C) があり、実際にはフィールド CSHOLD (28 番目のビット) があります。
|= はこの状況でどのように機能しますか?
理解するための助けに感謝します...すべてこの%)