2012年8月11日土曜日

RSPI on RX63N

GR-SAKURA ボードで CQPUB RX62Nのコード
http://www.kumikomi.net/interface/editors/2011/04/6cd-romrx62n.php
mp3p_rx62n_hew.zip を RX63Nで動作させようとしたが、手間取ったので、記載しておきます。
要は、RSPI0.SPSR.BIT.SPRF,SPTEFビットが RX63Nで消えたのが問題で
ある人はRSPI0.SPSR.BIT.IDLNF ビットを流用していたので、真似てみたが、動きが怪しい。
やっぱり、IR(RSPI0,SPRI0) で見るしかないもんかというわけで、IR(RSPI0,SPRI0)をみるようにしてやっと動作確認できた。

初期化部は
/* CS#(PC0/SSLA1)をLにする(RSPI_CH=0のとき) */
static void CS_LOW() {
 PORTC.PODR.BIT.B0 = 0;
}

/* CS#(PC0/SSLA1)をHにする(RSPI_CH=0のとき) */
static void CS_HIGH() {
 PORTC.PODR.BIT.B0 = 1;
}

//#define INS (!PORT1.PIDR.BIT.B5) /* SD_CD(P15)カード検出(真:あり, 偽:なし) */
//#define WP 0   /* 書き込み禁止(真:禁止, 偽:許可) */

static void CS_INIT() {  /* CS#,INS#,WP 各端子の初期化(RSPI_CH=0のとき) */
 PORTC.PMR.BIT.B0 = 0; /* CS#=GPIO */ 
 PORTC.PDR.BIT.B0 = 1; /* CS#=OUT */   
 PORTC.PODR.BIT.B0 = 1; /* CS#=H  */ 
}

void SPI_ATTACH() { 
      
 SYSTEM.PRCR.WORD = 0xA502; 
 MSTP(RSPI0)=0;        
        SYSTEM.PRCR.WORD = 0xA500;
 
 PORTC.PMR.BIT.B5 = 0;   
 PORTC.PMR.BIT.B6 = 0;   
 PORTC.PMR.BIT.B7 = 0;   
 MPC.PWPR.BIT.B0WI = 0;      
        MPC.PWPR.BIT.PFSWE = 1;     
 MPC.PC5PFS.BYTE = 13;  /* RSPI RSPCKA */       
 MPC.PC6PFS.BYTE = 13;  /* RSPI MOSIA  */
 MPC.PC7PFS.BYTE = 13;  /* RSPI MISOA  */
 MPC.PWPR.BIT.PFSWE = 0; 
 PORTC.ODR0.BYTE = 0;   /* CMOS */ 
 PORTC.ODR1.BYTE = 0;   /* CMOS */   
 PORTC.PMR.BIT.B5 = 1;   
 PORTC.PMR.BIT.B6 = 1;   
 PORTC.PMR.BIT.B7 = 1;   

 IPR(RSPI0,SPRI0)=0;
 IEN(RSPI0,SPRI0)=0;
}
送受信部(他3箇所も修正)
/* Receive a byte */
static
BYTE rcvr_spi (void)
{
 BYTE c;
+ IR(RSPI0,SPRI0)=0;
 RSPI0.SPDR = 0xFF;  /* Send a 0xFF */
- while (!RSPI.SPSR.BIT.SPRF) ; /* Wait for end of transfer */
+        while (!IR(RSPI0,SPRI0)) ; /* Wait for end of transfer */
 return RSPI0.SPDR;  /* Returen received byte */
}

電源ON部
static
void power_on (void) /* Enable SPI */
{
 CS_INIT();

 /* Attach RSPI module to I/O pads */
 SPI_ATTACH();

 /* Initialize RSPI module */
 RSPI0.SPCR.BYTE = 0;     /* Stop SPI */
 RSPI0.SPSR.BYTE = 0xa0;
 RSPI0.SPPCR.BYTE = 0x00;    /* Fixed idle value, disable loop-back mode */
 RSPI0.SPSCR.BYTE = 0;     /* Disable sequence control */
 RSPI0.SPDCR.BYTE = 0x20;    /* SPLW=1 */
 RSPI0.SPCMD0.WORD = 0x0700; /* LSBF=0, SPB=7, BRDV=0, CPOL=0, CPHA=0 */
 RSPI0.SPBR.BYTE = (PCLK / 2 / CLK_SLOW )- 1; /* Bit rate */
- RSPI0.SPCR.BYTE = 0x49;     /* Start SPI in master mode */
+ RSPI0.SPCR.BYTE = 0xC9;     /* Start SPI in master mode w/SPRIE */
 RSPI0.SPCR2.BYTE = 0;     /* */
}

2012年8月2日木曜日

TNKernel for RX

https://github.com/msalov/TNKernel-RX
TNkernel の RX62N移植作業をやっているのを発見。
さっそく、RX621でためしたら、動作確認できた。
ボードは http://akizukidenshi.com/catalog/g/gK-05763/ これ。
気をよくして、RX63Nではどうか?

ボードは http://japan.renesas.com/products/promotion/gr/index.jsp これ。
結構はまった。
RX62NからRX63Nの違い
1) SYSTEM.SCKCR の下位bitは仕様書では 00000000bなのだが、その値ではクロックが動作しない
そこで、FreeRTOSの RX63Nのソースを見ると、00010001bにしているではないか。

2) クロック関連レジスタを触る際は SYSTEM.PRCR レジスタでアクセス解除が必要。
MSTP(RTC)などの箇所の前後にアクセス解除と禁止をいれる必要あり。
(RX63N UM 表13.1 PRCRレジスタと保護されるレジスタの対応 参照)

3) MPC ポート機能設定の前後で、MPC.PWPRでのアクセス解除が必要、具体的には PxnPFSレジスタの設定時。
(RX63N UM 22.4.2 MPCレジスタ設定する場合の注意事項 参照)

4) RTC関連レジスタでIODEFINE.H でビットフィールド定義されているレジスタをそのまま、アクセスは危険。
たとえば
RTC.RCR1.BIT.PES = 6; /* Set periodic interrupts frequency to 256 Hz */
RTC.RCR1.BIT.PIE = 1; /* Enable periodic interrupts */
ではなく
RTC.RCR1.BYTE = 0x64;
while(0x64 != RTC.RCR1.BYTE) ;
と書く。
要は、書いた値が反映されるまでは、新しい値を書いたらダメということ。

(RX63N UM 29.2.17 RTCコントロールレジスタ1(RCR1)
...
AIE、PIE、PES[3:0]ビットは、カウントソースに同期して更新されます。RCR1レジスタを書き換えた場 合は、全ビットの値が更新されたことを確認してから次の処理を実行してください
...
RX62Nにはそんな制限なかった)

コンパイラは nahitechさんのと、kpit gnu toolで確認。
あっ、IODEFINE.H は GR-SAKURA のWEBコンパイル環境から落としました。