こんにちは
G10にてCS+のコード生成プラグインのR_IICA0_Slave_Sendを使用して送信をしようと思っています。
二つ目の引数に2を入れて送信したところ、受け側は0xXX 0xFFとなります。1バイト目は〇なのですが、
2バイト目が0xFFになります。どのようなことが考えられますか?
チョコです。
何か誤解があるようなので、少しコメントしておきます。
I2Cバスの仕様では、マスタが受信(スレーブ送信)を終了するときには、スレーブから受信した最後のデータに対してACK応答をしない(NACK応答をする)という規定があります。これは、I2Cバスのハード的な制約(信号がローに引かれた状態は、マスタといえどもハイにすることはできない)に対するもので、「受信を終了するからスレーブにそれ以上データを送るな…
RAM_BASEが0x80というのがありますが、
void R_IICA0_Slave_Send(uint8_t * const tx_buf, uint16_t tx_num)だと、どうなっているのか
という疑問がでました。
受信側からみるとコード生成の自局アドレス 仮に0x60 tx_buf[0]
0x80がtx_buf[1]ということ? 0x61?という疑問が湧きました。
RAM_BASEとスレーブアドレスは全く無関係です。
>受信側からみるとコード生成の自局アドレス 仮に0x60 tx_buf[0]
>0x80がtx_buf[1]ということ? 0x61?という疑問が湧きました。
少なくとも、スレーブアドレスはIICA0が対応しているだけで、
ユーザープログラムに対してデータとして渡される訳ではありません。
RAM_BASEはスレーブに書き込むアドレスレジスタ(1バイト目の
データ)の値の中でRAMの先頭を示すデータです。
通常、EEPROMやRAMおよび複数のレジスタを持つスレーブでは、
書き込みの最初のデータがこのようなRAMやレジスタ等のアドレスを
示します。この場合だと、アドレスが0x80以上ならRAMに対応して
いると考えてください。
つくたろうさんのスレーブはこのような内部のアドレス・レジスタは
使っていないようなので、マスタからの読み出し通信が起動されたら
単に送信するデータを順に送信するだけのはずです。
以上
ご回答ありがとうございます。
内部のアドレス・レジスタを使うのは
uint8_t static sreg ~
というのでしょうか? 検索した感じだとショート・ダイレクト・アドレッシングでしょうか。
CS+で新規作成したファイルに宣言しても、うまくいきませんでした。どこか設定を変更する
必要があるのでしょうか。
sregですが、これは、CA78K0Rでの機能です。あのプロジェクトは、CA78K0Rで作成してあり、それをCC-RLに移植しています。
CC-RLのマニュアル(R20UT3123JJ)の移行支援機能オプションを使って移植しています。
添付されているPDFにも、CC-RLのプロパティで以下のように設定しています。
今回は最初からCC-RLなので、「sreg」ではなく、「saddr」を使ってください。
CC-RLコンパイラのマニュアルには以下のような説明があります。
ここらを参考にしてください。
ありがとうございます。