| 
/******************************(spi_Mem.c)***************
 *  SPI接続メモリ(25LC1024/23LCV1024)読み書きライブラリ
 ********************************************************/
#include 
#include 
#include "mcc_generated_files/mcc.h"
#include "spi_Mem.h"
#define MBFSIZE	78                  // メモリ操作用バッファーサイズ
//=== グローバル変数 ============
char     Dlm[] = ",";               // 文字列区切りデリミタ
char     SBuf[20];                  // 文字列処理用バッファー
//--- SPIメモリー用
static uint32_t CrtAdr = 0;         // カレントアドレス
static uint8_t  DBuf[MBFSIZE];      // ページメモリ用バッファ
static uint8_t  SqMode = 0;         // シーケンスモードフラグ
static char     lstCmd;             // 最終コマンド
static uint8_t  spiRom = 1;         // spiRomかどうか
/*************************************
 *  SPI Mem function
 **************************************/
//---- ROMステータスの読み出し
uint8_t SPI_Rom_RdStat(){           // ROMのみ使用
    uint8_t stat;
    CS0_SetLow();
    SPI1_ExchangeByte(SPIROM_RD_STATS);
    stat = SPI1_ExchangeByte(0xAA); // 0xAAはダミー
    CS0_SetHigh();
    return stat;
}
//---- コマンドと24ビットアドレスを送信 
void sendAdr(uint8_t cmd, uint32_t adr){
    if(spiRom) CS0_SetLow();        // spiRom(25LC1024)選択
    else       CS1_SetLow();        // spiRam(23LCV1024)選択
    SPI1_ExchangeByte(cmd);         // send Command
    SPI1_ExchangeByte((uint8_t)(adr>>16));
    SPI1_ExchangeByte((uint8_t)(adr>>8));
    SPI1_ExchangeByte((uint8_t)adr);
} 
//-----  アドレスadrから、1バイトを読み出す
uint8_t SPI_Mem_Read(uint32_t adr){
    uint8_t dat;
    if(adr < 0x80000) spiRom = 1;   // spiRom(25LC1024)指定
    else              spiRom = 0;   // spiRam(23LCV1024)指定
    sendAdr(SPIMEM_READcmd,adr);    // send Read_CMD & Address
    dat = SPI1_ExchangeByte(0xAA);  // 0xAAはダミー
    if(spiRom) CS0_SetHigh();       // spiRomの場合の読込終了
    else       CS1_SetHigh();       // spiRamの場合の読込終了
    return dat;
}
//-----  アドレスadrに、1バイトdtを書き込む
uint8_t SPI_Mem_Write(uint32_t adr, uint8_t dat){
    if(adr < 0x80000){
        spiRom = 1;                 // spiRom(25LC1024)指定
        CS0_SetLow();
        SPI1_ExchangeByte(SPIROM_WR_ENABL); // Set Write EnableBit
        CS0_SetHigh();
    }else              spiRom = 0;  // spiRam(23LCV1024)指定
    sendAdr(SPIMEM_WRITEcmd,adr);   // send Write_CMD & Address
    SPI1_ExchangeByte(dat);         // adrにdatを書き込む
    if(spiRom){
        CS0_SetHigh();              // spiRomの場合の書込終了
        __delay_ms(6);
    }else{
        CS1_SetHigh();              // spiRamの場合の書込終了
    }
    return dat;
}
//-----  アドレスadrからnバイトをary[]に読み出す
void SPI_Mem_NRead(uint32_t adr,uint8_t *ary,uint16_t cnt){
    if(adr < 0x80000) spiRom = 1;   // spiRom(25LC1024)指定
    else              spiRom = 0;   // spiRam(23LCV1024)指定
    sendAdr(SPIMEM_READcmd,adr);    // send Read_CMD & Address
//	SPI1_ExchangeBlock(ary,cnt);
    SPI1_ReadBlock(ary,cnt);        // block read
    if(spiRom){
        CS0_SetHigh();
        while(SPI_Rom_RdStat() & 1);
    }else{
        CS1_SetHigh();
    }
}
//-----  アドレスadrからary[]のnバイトを書き込む
void SPI_Mem_NWrite(uint32_t adr,uint8_t *ary,uint16_t cnt){
    if(adr < 0x80000){
        spiRom = 1;                 // spiRom(25LC1024)指定
        CS0_SetLow();
        SPI1_ExchangeByte(SPIROM_WR_ENABL); // Set Write Enable Bit
        CS0_SetHigh();
    }else{ spiRom = 0;	}           // spiRam(23LCV1024)指定
    sendAdr(SPIMEM_WRITEcmd,adr);   // send Write_CMD & Address
//	SPI1_ExchangeBlock(ary,cnt);    // block write
    SPI1_WriteBlock(ary,cnt);       //  block write
    if(spiRom){
        CS0_SetHigh();
        while(SPI_Rom_RdStat() & 1);
    }else{
        CS1_SetHigh();
    }
}
//	・・・以下略 (abc902参照) ・・・
 |