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

 
 
> 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
Ответов (1 - 6)
Nosaer
сообщение Apr 25 2016, 13:25
Сообщение #2


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

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



Добрался до осциллографа, на линии SO у меня нет совершенно никакого ответа.
Плюс линия SCK не тактируется в том промежутке, когда должен идти ответ. Получается он даже не пытается получить ответ.
П.С. микроконтроллер XMEGA256A3AU
Go to the top of the page
 
+Quote Post
Lagman
сообщение Apr 25 2016, 15:38
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(Nosaer @ Apr 25 2016, 16:25) *
Добрался до осциллографа, на линии SO у меня нет совершенно никакого ответа.
Плюс линия SCK не тактируется в том промежутке, когда должен идти ответ. Получается он даже не пытается получить ответ.
П.С. микроконтроллер XMEGA256A3AU

Наверно (у других процессоров так), чтобы тактировался ответ надо в выходной буфер положить FF и начать его передавать.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 25 2016, 15:48
Сообщение #4


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

Группа: Свой
Сообщений: 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
aiwa
сообщение Apr 25 2016, 15:49
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Вы посылаете команду 05 и одновременно получаете в ответ в вполне справедливое 00 или FF как результат обмена, которое считаете статусом.
Для чтения статуса толкните еще на обмен.


Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 26 2016, 02:51
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Nosaer
сообщение Apr 26 2016, 06:40
Сообщение #7


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

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



О как оказывается)
Большое спасибо за разъяснение, будем пробовать)

jcxz, Я Write Enable отправлял, чтоб изменить определенный бит в статусе, чтобы при чтении статуса у меня было например не 0x00, а 0x02.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:02
Рейтинг@Mail.ru


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