Nosaer 0 24 апреля, 2016 Опубликовано 24 апреля, 2016 (изменено) · Жалоба Доброго всем времени суток. Столкнулся с проблемой при работе с 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 подтянуты к питанию. Вроде бы простая память, но где то накосячил и не могу выцепить ошибку( MR45V256.pdf Изменено 24 апреля, 2016 пользователем Nosaer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nosaer 0 25 апреля, 2016 Опубликовано 25 апреля, 2016 · Жалоба Добрался до осциллографа, на линии SO у меня нет совершенно никакого ответа. Плюс линия SCK не тактируется в том промежутке, когда должен идти ответ. Получается он даже не пытается получить ответ. П.С. микроконтроллер XMEGA256A3AU Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 25 апреля, 2016 Опубликовано 25 апреля, 2016 · Жалоба Добрался до осциллографа, на линии SO у меня нет совершенно никакого ответа. Плюс линия SCK не тактируется в том промежутке, когда должен идти ответ. Получается он даже не пытается получить ответ. П.С. микроконтроллер XMEGA256A3AU Наверно (у других процессоров так), чтобы тактировался ответ надо в выходной буфер положить FF и начать его передавать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 25 апреля, 2016 Опубликовано 25 апреля, 2016 · Жалоба Предлагаю изучить вопрос "что такое шина 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 25 апреля, 2016 Опубликовано 25 апреля, 2016 · Жалоба Вы посылаете команду 05 и одновременно получаете в ответ в вполне справедливое 00 или FF как результат обмена, которое считаете статусом. Для чтения статуса толкните еще на обмен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 26 апреля, 2016 Опубликовано 26 апреля, 2016 · Жалоба // установить write enable Для чтения статуса посылать "write enable" не нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nosaer 0 26 апреля, 2016 Опубликовано 26 апреля, 2016 · Жалоба О как оказывается) Большое спасибо за разъяснение, будем пробовать) jcxz, Я Write Enable отправлял, чтоб изменить определенный бит в статусе, чтобы при чтении статуса у меня было например не 0x00, а 0x02. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться