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;     /* */
}

1 件のコメント:

  1. TNRXA147AJ::Renesasからupdateが出てました。

    RSPI0.SPSR.BYTE;/* TNRXA147AJ */
    while (RSPI0.SPSR.BIT.IDLNF) ;
    //while(!IR(RSPI0,SPRI0)) ;
    //IR(RSPI0,SPRI0)=0;
    SPSRをカラ読みしてからIDLNFビットを確認すればよいらしい。

    返信削除