что с чип селектом то?
у меня вот такая инициализация, это от другой фрамки и другого проца, но это не важно
CODE
//настройки FRAM, значение статусного регистра при инициализации
//записываем в регистр статуса 0х00
//ставим WPEN в 0, отключаем ножку защиты записи
//ставим BP1, BP0 в 0, все блоки F-RAM не защищены от записи
#define FRAM_STAT_REG 0x00
/****************************************************************
Функция инициализации F-RAM.
входные данные:
нет
выходные данные:
код ошибки
0 - нет ошибок
****************************************************************/
int FRAMInit(void)
{
//задержку перед первым обращением к FRAM после подания питания можно не делать, так как
//есть задержка перед пуском контроллера после установления питания, а она значительно больше
FRAM_CS_UP; //на всякий случай, этого можно и не делать, так как важен уровень а не фронт
FRAM_HOLD_UP; //убираем сигнал ХОЛД с F-RAM, не используем этот режим
//коммуникации с F-RAM может осуществляются через SPI, несколько байтными посылками.
//Чтобы коммуникация не была прервана прерываниями, в которых другие модули
//также могут задействовать SPI, и прервать текущую посылку, испортить данные,
//запрещаем прерывания на время посылки (время между чип селекати F-RAM).
//если SPI реализован программно на выделенных контактах, и прерывания не требуется запрещать
//можно не определять макрос SPI_CLEAR_GIF
#ifdef FRAM_CLEAR_GIF
//на случай если прерывания были уже запрещены к моменту вызову функции
//сохраним статус прерываний
char IntStat=FRAM_GET_GIF_STATUS;
FRAM_CLEAR_GIF; //запрещаем прерывания
#endif
//выбираем FRAM, чипселект в 0
FRAM_CS_DOWN;
SendFRAMByte(FRAM_WREN); //разрешение записи для записи регистра статуса
FRAM_CS_UP; //снимает выбор F-RAM, ставим чип селект в 1
//новая командная посылка, прерывания остаются запрещенными
FRAM_CS_DOWN; //выбираем F-RAM, ставим чипселект в 0
SendFRAMByte(FRAM_WRST); //режим записи регистра статуса
SendFRAMByte(FRAM_STAT_REG); //записываем статусный регистр
FRAM_CS_UP;//снимает выбор F-RAM, ставим чип селект в 1
#ifdef FRAM_CLEAR_GIF
//восстанавливаем значение флага прерываний на момент входа в функцию,
//на случай если флаг был снят в других модулях
FRAM_RESTORE_GIF(IntStat);
#endif
return 0;
}
и к этому такие чтение - запись
CODE
/****************************************************************
Функция записи данных во F-RAM.
входные данные:
Addr - адрес записи данных (адрес 16 бит, FRAM до 512 кБит)
Data - данные для записи
Length - длинна данных в байтах
выходные данные:
код ошибки
0 - нет ошибок
****************************************************************/
int WriteFRAM(unsigned long int Addr, char *Data, unsigned Length)
{
//коммуникации с F-RAM может осуществляются через SPI, несколько байтными посылками.
//Чтобы коммуникация не была прервана прерываниями, в которых другие модули
//также могут задействовать SPI, и прервать текущую посылку, испортить данные,
//запрещаем прерывания на время посылки (время между чип селекати F-RAM).
//если SPI реализован программно на выделенных контактах, и прерывания не требуется запрещать
//можно не определять макрос SPI_CLEAR_GIF
#ifdef FRAM_CLEAR_GIF
//на случай если прерывания были уже запрещены к моменту вызову функции
//сохраним статус прерываний
char IntStat=FRAM_GET_GIF_STATUS;
FRAM_CLEAR_GIF; //запрещаем прерывания
#endif
//выбираем FRAM, чипселект в 0
FRAM_CS_DOWN;
SendFRAMByte(FRAM_WREN); //разрешения запси
FRAM_CS_UP; //выбираем F-RAM, ставим чипселект в 0
//новая командная посылка, прерывания остаются запрещенными
FRAM_CS_DOWN; //выбираем F-RAM, ставим чипселект в 0
SendFRAMByte(FRAM_WRITE); //режим записи в память
//передаем адрес данных для записи
#ifdef FRAM_17BIT_ADDRES //если используется 17 битная адресация для FRAM>512Кбит
SendFRAMByte((Addr>>16)&0xFF); //старший байт адреса, используется младший бит
#endif
SendFRAMByte((Addr>>8)&0xFF); //второй байт адреса
SendFRAMByte(Addr&0xFF); //младший байт адреса
for(unsigned int i=0;i<Length;i++)//цикл записи по длине данных
SendFRAMByte(Data[i]);
FRAM_CS_UP;//снимает выбор F-RAM, ставим чип селект в 1
#ifdef FRAM_CLEAR_GIF
//восстанавливаем значение флага прерываний на момент входа в функцию,
//на случай если флаг был снят в других модулях
FRAM_RESTORE_GIF(IntStat);
#endif
return 0;
}
/****************************************************************
Функция чтения данных из F-RAM.
входные данные:
Addr - адрес чтения данных (адрес 16 бит, FRAM до 512 кБит)
Data - буфер данных для сохранения прочитанных данных
Length - длинна данных в байтах
выходные данные:
код ошибки
0 - нет ошибок
****************************************************************/
int ReadFRAM(unsigned long int Addr, char *Data, unsigned Length)
{
//коммуникации с F-RAM может осуществляются через SPI, несколько байтными посылками.
//Чтобы коммуникация не была прервана прерываниями, в которых другие модули
//также могут задействовать SPI, и прервать текущую посылку, испортить данные,
//запрещаем прерывания на время посылки (время между чип селекати F-RAM).
//если SPI реализован программно на выделенных контактах, и прерывания не требуется запрещать
//можно не определять макрос SPI_CLEAR_GIF
#ifdef FRAM_CLEAR_GIF
//на случай если прерывания были уже запрещены к моменту вызову функции
//сохраним статус прерываний
char IntStat=FRAM_GET_GIF_STATUS;
FRAM_CLEAR_GIF; //запрещаем прерывания
#endif
//выбираем FRAM, чипселект в 0
FRAM_CS_DOWN;
SendFRAMByte(FRAM_READ); //режим чтения памяти
//передаем адрес данных для чтения
#ifdef FRAM_17BIT_ADDRES //если используется 17 битная адресация для FRAM>512Кбит
SendFRAMByte((Addr>>16)&0xFF); //старший байт адреса, используется младший бит
#endif
SendFRAMByte((Addr>>8)&0xFF); //второй байт адреса
SendFRAMByte(Addr&0xFF); //младший байт адреса
for(unsigned int i=0;i<Length;i++)//цикл чтения по длинне данных
ReadFRAMByte(&Data[i]);
FRAM_CS_UP;//снимает выбор F-RAM, ставим чип селект в 1
#ifdef FRAM_CLEAR_GIF
//восстанавливаем значение флага прерываний на момент входа в функцию,
//на случай если флаг был снят в других модулях
FRAM_RESTORE_GIF(IntStat);
#endif
return 0;
}