|
//Keil C51 для AT45DB161
#define ReadStat 0x57 //чтение статуса
#define ToBuf1 0x84 //Запись данных в буфер
#define WrBuf1 0x83 //запись буфера 1 во флэш
#define ReadMem 0x52 //чтение флэш
#define SeqRead 0x68 //последовательное чтение из флэш
#define AutoRewrite 0x58 //перезапись флэш
void StartAT45D(void) //настраивает SPI и включает флэш
{
SPCON = 0x7D; //01111101 CPOL=CPHA=1, SCK=Fosc/4, SSDIS = 1;
FlashCS = 0; //Включаем флэш
}
void StopAT45D(void) //выключает флэш и SPI
{
FlashCS = 1; //выключаем флэш
SPCON &= (SPE_^0xFF); //выключаем SPI
}
ubyte ReadAT45DStat(void) //возвращает байт статуса флэш
{
ubyte uuu;
StartAT45D();
SendToSPI(ReadStat);
uuu = GetFromSPI();
StopAT45D();
return uuu;
}
void StartRdMemAT45D(uword pagenum)
//инициализирует чтение флэш начиная с байта 0 страницы pagenum
{
StartAT45D();
pagenum <<=2; //формируем адрес
SendToSPI(ReadMem); //посылаем команду
SendToSPI(HighByte(pagenum)); //адрес
SendToSPI(pagenum);
SendNullToSPI(); //добираем до 64 бит в посылке
SendNullToSPI();
SendNullToSPI();
SendNullToSPI();
SendNullToSPI();
}
void StartContRdMemAT45D(uword pagenum)
//инициализирует непрерывное чтение флэш начиная с байта 0 страницы pagenum
{
StartAT45D();
pagenum <<=2; //формируем адрес
SendToSPI(SeqRead); //посылаем команду
SendToSPI(HighByte(pagenum)); //адрес
SendToSPI(pagenum);
SendNullToSPI(); //добираем до 64 бит в посылке
SendNullToSPI();
SendNullToSPI();
SendNullToSPI();
SendNullToSPI();
}
void StartWrBuf1AT45D(uword bytenum)
//инициализирует запись в буфер 1 начиная с байта bytenum
{
StartAT45D();
SendToSPI(ToBuf1); //посылаем команду
SendNullToSPI();
SendToSPI(HighByte(bytenum)); //адрес
SendToSPI(LowByte(bytenum));
}
void Buf1toMemAT45D(uword pagenum)
//запись содержимого Buffer 1 в страницу pagenum флэш c build-in erase
{
StartAT45D();
pagenum <<=2;
SendToSPI(WrBuf1); //посылаем команду
SendToSPI(HighByte(pagenum)); //адрес
SendToSPI(LowByte(pagenum));
SendNullToSPI(); //добираем до 32 бит в посылке
StopAT45D();
}
E-mail: info@telesys.ru