Easyelectronics.ru

Электроника для всех
Текущее время: 05 июн 2020, 13:31

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 00:51 
Только пришел

Зарегистрирован: 30 мар 2020, 14:46
Сообщения: 8
Всем привет!

Вычитываю Manufactur ID из 25Q64.

Для этого посылаю 5 байт: 0x90, 0x00, 0x00, 0x00, 0xFF (Последний- "dummy" байт). На 5 байт флеш отвечает значением Manufactur ID 0xEF

Посылка идет в режиме "continious transfer"

После 5 байта, ждем TXE, потом ждем сброса флага BSY

Итак, посылка прошла, флаг BSY сброшен в "0". Вопрос: Почему после окончания передачи в регистре DR значение 0x00?

Очевидно, что передача окончена и в DR должен быть Manufactur ID, значение "0xEF"

Причем посмотрел лог. анализатором, он видит ответ 0xEF от флеш

Речь не об RXNE, а именно о том почему в DR не то что нужно после окончания передачи?

Еще один момент. Если в режиме дебага поставить точку останова на строку: SPI1->DR = 0xFF; // Dummy byte , а потом сделать один шаг, то в manufId заносится правильное значение 0xEF

Код:
   volatile uint8_t manufId=0;
   
   SPI1->CR1 |= SPI_CR1_SPE;
   
   CS_LOW      
   
   SPI1->DR = 0x90; // Read Manuf ID command
   while(!(SPI1->SR & SPI_SR_TXE)){}
      
   SPI1->DR = 0x00;
   while(!(SPI1->SR & SPI_SR_TXE)){}   
      
   SPI1->DR = 0x00;
   while(!(SPI1->SR & SPI_SR_TXE)){}   
   
   SPI1->DR = 0x00;
   while(!(SPI1->SR & SPI_SR_TXE)){}      
      
   SPI1->DR = 0xFF; // Dummy byte      
   while(!(SPI1->SR & SPI_SR_TXE)){}      
   while(SPI1->SR & SPI_SR_BSY){}
      
   manufId = SPI1->DR;
      
   CS_HIGH


Вложения:
2020-04-02_22-28-09.jpg
2020-04-02_22-28-09.jpg [ 176.83 Кб | Просмотров: 145 ]
2020-04-02_22-18-22.png
2020-04-02_22-18-22.png [ 158.02 Кб | Просмотров: 145 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:12 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
Lacoste писал(а):
Для этого посылаю 5 байт: 0x90, 0x00, 0x00, 0x00, 0xFF (Последний- "dummy" байт). На 5 байт флеш отвечает значением Manufactur ID 0xEF

Это ответ не на 5-й байт. Если бы у SPI был достаточно большой FIFO, у некоторых серий таковой имеется, то это был бы ответ на первый байт. Если FIFO нет, как у F1, или его размер недостаточен, то выставляется флаг переполнения и далее данные не принимаются. При пошаговой отладке этого можно не заметить, т.к. OVR сбрасывается за счет чтения DR и SR. Помимо этого не понятно почему TXE проверяется после отправки...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:14 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
RXNE для приёма используют только трусы. Какая-то шизофрения с этим SPI в последнии дни, сколько тем в топе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:19 
Только пришел

Зарегистрирован: 30 мар 2020, 14:46
Сообщения: 8
Reflector писал(а):
Помимо этого не понятно почему TXE проверяется после отправки...


После отправки ждем выставления TXE для загрузки в буфер следующего байта


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:24 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 2007
100500 раз и те же грабли.
Как будто отладчик не читает DR вместо вас.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:25 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
Lacoste писал(а):
После отправки ждем выставления TXE для загрузки в буфер следующего байта
TXE ждут перед отправкой. Перед отправкой последнего байта перед приёмом надо ещё DR вычитать, чтобы OVR скинуть. Ну и RXNE ни-ни.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:43 
Только пришел

Зарегистрирован: 30 мар 2020, 14:46
Сообщения: 8
VladislavS писал(а):
Перед отправкой последнего байта перед приёмом надо ещё DR вычитать, чтобы OVR скинуть. Ну и RXNE ни-ни.


Я Вас понял:
Код:
   SPI1->DR = 0x00; // Байт №1
   while(!(SPI1->SR & SPI_SR_TXE)){}   
      
   SPI1->DR = 0x00; // Байт №2
   while(!(SPI1->SR & SPI_SR_TXE)){}   
   
   SPI1->DR = 0x00; // Байт №3
   while(!(SPI1->SR & SPI_SR_TXE)){}   

   // Вычитываем регистр, чтобы сбросить флаг после байта №3
   (void) SPI1->DR;

   //Флаг сбросится, но байт №3 еще не отправлен. И флаг ОПЯТЬ взведется после отправки. Получаем ровно то, что было до сброса флага

   //Этот байт последний
   SPI1->DR = 0xFF; // Dummy byte      
   while(!(SPI1->SR & SPI_SR_RXNE)){}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:45 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 804
x893 писал(а):
100500 раз и те же грабли.
Как будто отладчик не читает DR вместо вас.

Возможно им нравится сражаться с ветряными мельницами. С опытом научатся сворачивать вкладку в просмотре регистров, а то и мануал начнут читать - всякое бывает.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:45 
Только пришел

Зарегистрирован: 30 мар 2020, 14:46
Сообщения: 8
VladislavS писал(а):
Lacoste писал(а):
надо ещё DR вычитать, чтобы OVR скинуть.

Получается пока не будет сброшен флаг OVR, запись в RX буфер не будет произведена?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:50 
Только пришел

Зарегистрирован: 30 мар 2020, 14:46
Сообщения: 8
Похоже нашел ответ. Буфер приема не обновляется пока не будет сброшен флаг OVR.

Reflector, VladislavS, спасибо!

Overrun condition
An overrun condition occurs when the master device has sent data bytes and the slave
device has not cleared the RXNE bit resulting from the previous data byte transmitted.
When an overrun condition occurs:
• the OVR bit is set and an interrupt is generated if the ERRIE bit is set.
In this case, the receiver buffer contents will not be updated with the newly received data
from the master device. A read from the SPI_DR register returns this byte. All other
subsequently transmitted bytes are lost


Последний раз редактировалось Lacoste 03 апр 2020, 02:06, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103C8T6 + SPI + 25Q64. BSY флаг
СообщениеДобавлено: 03 апр 2020, 01:59 
Только пришел

Зарегистрирован: 30 мар 2020, 14:46
Сообщения: 8
AVI-crak писал(а):
x893 писал(а):
100500 раз и те же грабли.
Как будто отладчик не читает DR вместо вас.

Возможно им нравится сражаться с ветряными мельницами. С опытом научатся сворачивать вкладку в просмотре регистров, а то и мануал начнут читать - всякое бывает.


А вы что, рядом со мной стояли на предмет залезу в мануал ил инет?

Упустил OVR, не так уж очевидно, что при взведенном флаге приемный буфер не обновляется.

Reflector, VladislavS, спасибо! Все понятно стало


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: mab7272, Maik


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB