GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
GR-PEACHでのI2C通信の方法について質問させていただきます。
「RZ/A1Hグループ、RZ/A1Mグループ ユーザーズマニュアル ハードウェア編 Rev.6.00 2021.01」< https://www.renesas.com/jp/ja/document/mat/rza1h-group-rza1m-group-users-manual-hardware?language=ja&r=467676 > というマニュアルを参考に、
・GR-PEACH(RZ/A1H)
・キャラクタLCD(秋月電子:ACM1602NI-FLW-FBW-M01)
を用いて、I2C通信でLCD表示を行おうとしています。
I2Cバスインタフェースには、P1_2がscl、P1_3がsdaである「チャネル1(RIIC1)」を使用し、
キャラクタLCDのスレーブアドレスは「1010000(7bit)」です。
I2C関連の初期化は以下の手順で行おうとしています。
1.P1_2, P1_3の機能を「兼用モード/第1兼用機能/出力」に設定(マニュアルp2596)
2.「18.5.2 初期設定」の図18.5に従ってRIICの初期化(マニュアルp851)
3.LCDの初期化 (参考:https://akizukidenshi.com/download/ds/xiamen/ACM1602NI-FLW-FBW-M01_20190219.pdf )
しかし、RIICの初期化にて、「18.5.2 初期設定」の図18.5(マニュアルp851)の「RIICnSARyを設定」の部分が正しく行われません。
スレーブアドレスが7bitなのでRIIC1SAR0.FSyに「0」、RIIC1SAR0.SVA[7:1]にスレーブアドレスである「1010000」を設定したいのですが、
設定後にRIIC1SAR0を読み出しても「RIIC1SAR0=0x0」となってしまい、スレーブアドレスが設定されませんでした(「RIIC1SAR0=0xa0」となれば正しい)。
そのため、スレーブアドレスを10bitモードにして適当なスレーブアドレスを設定した場合、RIICSAR0はどのようになるか検証してみたところ、
スレーブアドレスを10bitとしてRIIC1SAR0.FSyに「1」、
RIIC1SAR0.SVA[7:1]、RIIC1SAR0.SVA0に適当なスレーブアドレス「0011111110」を設定してみると、「RIIC1SAR0=0x50」(「RIIC1SAR0=0x80fe」となれば正しい)
「0000010010」を設定してみると、「RIIC1SAR0=0x10」(「RIIC1SAR0=0x8012」となれば正しい)
となってしまい、どちらのパターンでもRIIC1SAR0の正しい値は出力されませんでした。
また、その後に設定を行う「RIIC1.SER」や「RIIC1.MR1」については、
同じ方法で出力すると、正しく設定した値が出力されることを確認しています。
以下にI2C通信関連の部分を抜粋したプログラムを示します。
どのようにプログラムを書けば、RIIC1SAR0に意図した値を設定できるのか、なぜこのプログラムではRIIC1SAR0の値が正しく設定されないのか教えていただきたいです。
また、その他の場所でも、初期化の仕方の間違いなどがあればご指摘いただきたいと思います。
よろしくお願いいたします。
---- io_port.c ------------------------------------------------------------------------------------------------------------------------------------
#define PFCAE1_adrs (unsigned short *)(0xfcfe3a04)#define PFCE1_adrs (unsigned short *)(0xfcfe3604)#define PFC1_adrs (unsigned short *)(0xfcfe3504)
#define PFCAE1 *PFCAE1_adrs#define PFCE1 *PFCE1_adrs#define PFC1 *PFC1_adrs
void io_port_init() // 汎用ポートの初期設定
{
// I2C通信以外の汎用ポートの初期設定(省略)
// 初期化1:兼用モード設定 PM1 = 0xbf00; PMC1 |= 0x000c; PFCAE1 &= 0xfff3; PFCE1 &= 0xfff3; PFC1 &= 0xfff3;
// その他ポートの初期値設定(省略)
}
---- io_port.c (end) ------------------------------------------------------------------------------------------------------------------------------------
---- lcd.c -------------------------------------------------------------------------------------------------------------------------------------------------
#define RIIC1_adrs (unsigned int *)(0xfcfee400)
#define RIIC1_CR1 *(RIIC1_adrs + 0x0000)#define RIIC1_CR2 *(RIIC1_adrs + 0x0004)#define RIIC1_SR2 *(RIIC1_adrs + 0x0024)#define RIIC1_SAR0 *(RIIC1_adrs + 0x0028)#define RIIC1_SAR1 *(RIIC1_adrs + 0x002c)#define RIIC1_SER *(RIIC1_adrs + 0x0018)#define RIIC1_MR1 *(RIIC1_adrs + 0x0008)#define RIIC1_BRL *(RIIC1_adrs + 0x0034)#define RIIC1_BRH *(RIIC1_adrs + 0x0038)#define RIIC1_IER *(RIIC1_adrs + 0x001c)#define RIIC1_DRT *(RIIC1_adrs + 0x003c)
#define SET_RIIC1_CR1_ICE_0 (RIIC1_CR1 &= 0x7f)#define SET_RIIC1_CR1_ICE_1 (RIIC1_CR1 |= 0x80)
#define SET_RIIC1_CR1_IICRST_0 (RIIC1_CR1 &= 0xbf)#define SET_RIIC1_CR1_IICRST_1 (RIIC1_CR1 |= 0x40)
#define SET_RIIC1_SAR0 (RIIC1_SAR0 = 0x80fe)#define SET_RIIC1_SER (RIIC1_SER = 0x00000009)
#define SET_RIIC1_MR1 RIIC1_MR1 = 0x67;#define SET_RIIC1_BRL RIIC1_BRL = 0x03;#define SET_RIIC1_BRH RIIC1_BRH = 0x02;
#define SET_RIIC1_IER (RIIC1_IER = 0x00)
#define RIIC1_CR2_BBSY_0 ((RIIC1_CR2|0x7f) == 0x7f)
#define SET_RIIC1_CR2_ST_1 (RIIC1_CR2 |= 0x02)#define SET_RIIC1_CR2_SP_1 (RIIC1_CR2 |= 0x08)
#define RIIC1_SR2_NACKF_0 ((RIIC1_SR2|0xef) == 0xef)#define RIIC1_SR2_TDRE_1 ((RIIC1_SR2&0x80) == 0x80)#define RIIC1_SR2_TEND_1 ((RIIC1_SR2&0x40) == 0x40)#define RIIC1_SR2_STOP_1 ((RIIC1_SR2&0x08) == 0x08)
#define SET_RIIC1_SR2_STOP_0 (RIIC1_SR2 &= 0xf7)
#define SET_RIIC1_SR2_NACKF_0 (RIIC1_SR2 &= 0xef)
void LCD_init()
unsigned int c;
//初期化2.「18.5.2 初期設定」の図18.5に従ってRIICの初期化 SET_RIIC1_CR1_ICE_0; SET_RIIC1_CR1_IICRST_1; SET_RIIC1_CR1_ICE_1;
SET_RIIC1_SAR0; // この設定が正しく行われない
c = RIIC1_SAR0; // RIIC1.SAR0 の読み出し printf("SAR0: %x\n",c); // RIIC1.SAR0 の出力
SET_RIIC1_SER;
SET_RIIC1_MR1; SET_RIIC1_BRL; SET_RIIC1_BRH;
SET_RIIC1_IER;
SET_RIIC1_CR1_IICRST_0;
// 初期化3.LCDの初期化 long_delay(); WriteCommand(0x01); //0x01: Clear Display
long_delay(); WriteCommand(0x38); //0x38: Function Set (8bit, 2line, 5*8dots)
long_delay(); WriteCommand(0x01); //0x01: Clear Display
long_delay(); WriteCommand(0x0f); //0x0f: Display ON/OFF Control (dispON, cursorON, cursor blinkingON)
long_delay(); WriteCommand(0x06); //0x06: Entry Mode Set (Increment direction, shiftOFF)
long_delay();
void long_delay(void) // 待ち時間{ uchar i,j; for(i=0;i<25;i++){ for(j=0;j<255;j++){} }
return;}
//コマンド送信 I2C Interface protocolvoid WriteCommand(int command){ while(!RIIC1_CR2_BBSY_0){}
//1. start condition SET_RIIC1_CR2_ST_1;
long_delay(); long_delay();
//2. slave address(LCM=1010000) RIIC1_DRT = 0xa0;
while(RIIC1_SR2_NACKF_0){
if(!RIIC1_SR2_TDRE_1){continue;}
//3. control byte RIIC1_DRT = 0x00; long_delay();
//4. command body RIIC1_DRT = command; long_delay();
while(!RIIC1_SR2_TEND_1){} break; }
//5. stop condition SET_RIIC1_SR2_STOP_0; SET_RIIC1_CR2_SP_1; while(!RIIC1_SR2_STOP_1){}
SET_RIIC1_SR2_NACKF_0; SET_RIIC1_SR2_STOP_0;
//データ送信 I2C Interface protocolvoid WriteData(int dat)
// void WriteCommand(int) とほぼ同じ(省略)
// 3. control byte のみ次のように変更 RIIC1_DRT = 0x00;
---- lcd.c (end) -------------------------------------------------------------------------------------------------------------------------------------------------