реклама на сайте
подробности

 
 
> AVR+Fram
Nosaer
сообщение Apr 24 2016, 10:20
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 85
Регистрация: 6-02-15
Пользователь №: 84 967



Доброго всем времени суток.
Столкнулся с проблемой при работе с FRAM по SPI (MR45V*), вроде как практически тоже самое что и FM25CL.

Пытаюсь считать статус памяти, выдает или 0x00(преимущественно) или 0xFF. Но явно не то, что я ожидаю увидеть.


Код
void SPIE_init()
{    
    PORTE.DIRCLR = (1<<SPIMISO);
    PORTE.DIRSET = (1<<SPIMOSI) | (1<<SPISCK) | (1<<SPICS);
    PORTE.OUTSET = (1<<SPICS);
    SPIE.CTRL = SPI_ENABLE_bm | SPI_MASTER_bm | SPI_MODE_0_gc | SPI_PRESCALER_DIV4_gc;
}


void FeRAM_out(void)
{    
    // Тут пытаюсь изменить статус памяти
    PORTE.OUTCLR = (1<<SPICS);                                                    // Включаем ChipSelect
    SPIE.DATA = 0x06;                                                            // Устанавливаю бит разрешения записи
    while( !(SPIE_STATUS & SPI_IF_bm) );                                            // Жду когда отправится
    PORTE.OUTSET = (1<<SPICS);                                                    // Выключаем ChipSelect
    
       // Здесь пытаюсь считать статус
    PORTE.OUTCLR = (1<<SPICS);                                                    // Включаем ChipSelect
    SPIE.DATA = 0x05;                                                            // Еще раз Отправка команды на получение статуса
    while( !(SPIE_STATUS & SPI_IF_bm) );                                            // Жду ответа об отправке
    StatusSRWD = SPIE.DATA;                                                        // Получаю ответ
    sendCharE0(StatusSRWD);                                                     // Скидываю ответ по UART для наглядности
    PORTE.OUTSET = (1<<SPICS);                                                    // Выключаем ChipSelect
}


#WP и #HOLD подтянуты к питанию.
Вроде бы простая память, но где то накосячил и не могу выцепить ошибку(

Сообщение отредактировал Nosaer - Apr 24 2016, 11:23
Прикрепленные файлы
Прикрепленный файл  MR45V256.pdf ( 267.15 килобайт ) Кол-во скачиваний: 58
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
esaulenka
сообщение Apr 25 2016, 15:48
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Предлагаю изучить вопрос "что такое шина SPI". Вообще SPI, не вдаваясь в детали FRAM и XMega.
Тут-то и выяснится, что операций "чтение" и "запись" по отдельности нет. На каждый байт, записанный в шину мастером, слейв записывает свой байт, и мастер его оттуда читает.
Отсюда вывод - чтобы что-то прочитать с шины, мастер должен туда что-то записать. Обычно записывают ноль или 0xFF.

Теперь пишете функцию обмена одним байтом:
Код
unsigned char ProcessSPI (unsigned char data)
{
    // записать data в шину
    // подождать, пока отправится (мне лень изучать документацию XMega, извините)
    // return данные из шины
}


и вызываете её:
Код
// установить write enable
ChipSelect (true);
ProcessSPI (0x06);
ChipSelect (false);

// проверить статус
ChipSelect (true);
ProcessSPI (0x05);
status = ProcessSPI (0x00);
ChipSelect (false);


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 26 2016, 02:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(esaulenka @ Apr 25 2016, 21:48) *
// установить write enable

Для чтения статуса посылать "write enable" не нужно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 14:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016