/******************************(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参照) ・・・
|