1

レジストリ(最初?)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 番目のビット) があります。

|= はこの状況でどのように機能しますか?

理解するための助けに感謝します...すべてこの%)

4

4 に答える 4

4

レジスタのアドレスと値の概念を誤解していると思います。

CSDEF0SPI1モジュールのレジスタがアドレスにあると言うとき、あなたは正しいです(あなたが与えた構造の説明に基づいています)0x01F0E000 + 0x4C。このアドレスは変更されることはなく、ハードウェア設計によって定義されます。

次のステートメントを使用すると、アドレスではなくレジスタの値を操作できます。

spi->SPIDEF |= CSDEF0; //set 0 bit in the registry field 
spi->SPIDAT1 |= CSHOLD;  //set bit 28

演算子はビットごとの|=ORであり、演算子を代入します。これは、次と同等です。

spi->SPIDEF = spi->SPIDEF | CSDEF0; //set 0 bit in the registry field 
spi->SPIDAT1 = spi->SPIDAT1 | CSHOLD;  //set bit 28

CSDEF0に定義されているように0x00000001、最初のステートメントでは、SPIDEFレジスタのLSBビットを効果的に設定し、他のすべてのビットを元の値のままにします。

于 2013-02-07T08:21:41.637 に答える
1

ビットには個別のアドレスはありません。

代わりに、組み込みの世界での一般的な方法は、いくつかの小さな属性をより大きなレジスタに連結することです。たとえば、リアルタイムスケジューラの内部を次のように定義できます。

   31 30 29 28 27     26 25 24 32 22     21 20 19     18          0
 [ max_priority  ] [ current_priority] [ reserved]   [  address_xxxx ]

ここで、max_priorityは、値が0〜31の5ビットの符号なし整数になります。max_priority0をその値の最下位ビットとして定義することもできます。これらのパラメータはすべて、同じ絶対アドレス(REG_BASE +オフセット)内でアクセスされます。

于 2013-02-07T08:21:31.497 に答える
1

しかし、なぜ CSDEF0 がビット 0 なのですか??

このマクロの目的は、ビット 0 を 1 に設定することです。このマクロがいずれかのレジスタと OR されると、そのレジスタのビット 0 が 1 に設定されます。

例えば

spi->SPIDEF = 0x050Aつまり、0x050A ==> 0000 0101 0000 1010 を取ります

CSDEF0 を使用して spi->SPIDEF の 0 番目のビットを設定します。

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

spi->SPIDEF ==> 0000 0101 0000 1011

SPIDAT1 レジストリの CSHOLD フィールドのアドレスが 0x10000000 になっているのはなぜですか??

0 番目のビットを表すために CSDEF0 が使用されるのと同じように、28 番目のビットには CSHOLD が使用されます。

0x000001 および 000001 (???) の 16 進数および 2 進数表現と混同していると思います。

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
于 2013-02-07T08:19:37.057 に答える
1

しかし、なぜ CSDEF0 はビット 0 なのですか?

なぜなら:

#define CSDEF0 (0x00000001) //bit 0

それらが意味するのは、「値が0のビット」ではなく、「位置0のビット」です。

そして、以下について:

#define CSOLD (0x10000000) //ビット 28

16 進表記を 2 進表記に変換すると、それが明確になります。

|= はこの状況でどのように機能しますか?

これらの位置 ( 0と 28)の 1 ビットは、以前にその変数にあった値にORされます。

于 2013-02-07T08:18:22.267 に答える