Community Translation - Endian Format in a PSoC® 3/4/5LP Device Versus a Compiler – KBA91560

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

Hi,

I'd like to translate KBA91560 into Japanese.

moto

Original KBA: KBA91560

Endian Format in a PSoC® 3/4/5LP Device Versus a Compiler – KBA91560

Translated by: MoTa_728816

==============================

タイトル: PSoC® 3/4/5LP デバイスとコンパイラのエンディアンフォーマット - KBA91560

ヴァージョン: *A

質問:

PSoC® 3 Keil コンパイラは 16- と 32-bit の変数にビッグエンディアンを使用しています。PSoC 3 デバイスはマルチバイトのレジスタ (16- と 32-bit レジスタ) にリトルエンディアンを使用しています。CPU と DMA  経由でレジスタとアクセスするときに、どのようにしてバイトの順番をスワップするのですか? これは GNU コンパイラコレクション (GCC) や Keil™ Microcontroller Development Kit (MDK) コンパイラを使用する PSoC 4/5LP でも使用出来るのでしょうか?

回答:

CPU アクセス:

Keil コンパイラは内部でバイトスワッピングを制御するレジスタアクセス用のマクロ (cymem.a51 で定義されています) を提供しています。PSoC 3 デバイスの 8-, 16-, 32-bit レジスタをアクセスする場合にはこれらのマクロを使用する必要があります。

XDATA スペースの最初の 64K にマップされるレジスタアクセスマクロ:

  • CY_GET_REG8(addr)
  • CY_SET_REG8(addr, value)
  • CY_GET_REG16(addr)
  • CY_SET_REG16(addr, value)
  • CY_GET_REG24(addr)
  • CY_SET_REG24(addr, value)
  • CY_GET_REG32(addr)
  • CY_SET_REG32(addr, value)

XDATA スペースの最初の 64K 以降にマップされるレジスタアクセスマクロ:

  • CY_GET_XTND_REG8(addr)
  • CY_SET_XTND_REG8(addr, value)
  • CY_GET_XTND_REG16(addr)
  • CY_SET_XTND_REG16(addr, value)
  • CY_GET_XTND_REG24(addr)
  • CY_SET_XTND_REG24(addr, value)
  • CY_GET_XTND_REG32(addr)
  • CY_SET_XTND_REG32(addr, value)

DMA アクセス:

ソースとデスティネーションのエンディアンが異なる場合、DMA は転送中にエンディアンのバイトスワップを行うようにプログラムすることが可能です。

PHUB.TDMEM[0..127].ORG_TDO レジスタの SWAP_EN ビットでエンディアンスワップの有無を設定します。SWAP_EN が '1' の場合、エンディアンスワップが行われます。スワップのサイズは PHUB.TDMEM[0..127].ORG_TDO レジスタの SWAP_SIZE ビットで判断されます。

  • SWAP_SIZE = 0 の場合、スワップサイズは 2 バイトとなります、これは DMA 転送中に 2 バイト毎にエンディアンスワップが行われることを意味します。
    下記は TD コンフィグレーション API で 2 バイトデータのスワッピングを有効にするコードスニペットです。
    CyDmaTdSetConfiguration(myTd, 2, myTd, TD_TERMOUT0_EN | TD_SWAP_EN);

  • SWAP_SIZE = 1 の場合、スワップサイズは 4 バイトとなります、これは DMA 転送中に 4 バイト毎にエンディアンスワップが行われることを意味します。
    下記は TD コンフィグレーション API で 4 バイトデータのスワッピングを有効にするコードスニペットです。
    CyDmaTdSetConfiguration(myTd, 4, myTd, TD_TERMOUT0_EN | TD_SWAP_EN | TD_SWAP_SIZE4);

PSoC 4/5LP:

PSoC 4/5LP は Keil コンパイラを使用する PSoC 3 と異なり、リトルエンディアンに基づく GCC または MDK コンパイラを使用するようになっています。そのため PSoC 5LP にコードを移植する場合には DMA バイトスワッピングは無効にする必要があります。PSoC 4 は DMA をサポートしていないため、これは PSoC 4 には該当しません。

より詳細な情報は DMA component datasheet, PSoC 3 Technical Reference ManualPSoC 5LP Technical Reference Manual をご参照ください。

(DMA をサポートしている PSoC 4 の) PSoC 4 の DMA の構造は PSoC 3/5LP の DMA とは少し異なります。PSoC 4 の DMA にはエンディアンスワッピングがありません。詳細については PSoC 4 DMA Component Datasheet をご参照ください。

==============================

12-May-2020

moto

0 Likes
0 Replies