Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2018, 12:28

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 05 ноя 2012, 00:39 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
Спасибо всем большое за разъяснения!

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 22 ноя 2013, 14:25 
Здравствуйте!

Зарегистрирован: 07 ноя 2013, 13:12
Сообщения: 2
DimanVIP писал(а):
dosikus_2 писал(а):
Здесь так же надо исправлять
С тем же успехом с этим справляется и флаг BSY.


Вдогонку в RM0031 написано:
"Do not use the BSY flag to handle each data transmission or reception. It is better to use TXE and RXNE flags instead."

Не используйте флаг BSY для обработки приема и передачи. Лучше используйте флаги TXE RXNE.
страница 548.

_________________
настоящая революция всегда начинается вдруг


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 22 ноя 2013, 15:57 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5101
megannnn666 писал(а):
Не используйте флаг BSY для обработки приема и передачи.


Вот так и искажается оригинал . :))))))))
Подумайте , смысл фразы Вы практически полностью исказили .

Цитата:
Не используйте флаг BSY для обработки каждой передачи или приема данных.

Ключевое слово каждой , в данном контексте более подходит одиночной.
Для блочных транзакций нужно юзать именно BSY , например с DMA ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 22 ноя 2013, 18:15 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Google Online Translator... ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 13 дек 2017, 09:42 
Только пришел

Зарегистрирован: 24 июн 2015, 10:06
Сообщения: 6
Тоже столкнулся с нолями в ответе по SPI. Проц правда STM8S207, не L серия.
С SPL я не работаю, пишу напрямую в регистры.
Использовал алгоритм из мануала:

Full Duplex Transmit and receive procedure in master or slave mode
(BDM=0 and RXONLY = 0)
1.Enable the SPI by setting the SPE bit
2. Write the first data to be transmitted in the SPI_DR register (this clears the TXE flag).
3. Wait until TXE = 1 and write the second data to be transmitted. Then wait until RXNE = 1 and read the SPI_DR to get the first received data (this clears the RXNE bit). Repeat this operation for each data to be transmitted/received until the n-1 received data.
4. Wait until RXNE = 1 and read the last received data.
5. Wait until TXE = 1 and then wait until BSY = 0 before disabling the SPI.
This procedure can also be implemented using dedicated interrupt subroutines launched at each rising edge of RXNE or TXE flags.

Сконфигурил SPI:
Код:
SPI->CR1=SPI_CR1_BR&0x08;   //div4. CPU=8MHz, SPI 2MHz
SPI->CR2=0x03;            //SSM-1: Software slave management enabled. SSI-1: Master mode
SPI->CR1|=SPI_CR1_MSTR;      //SPI Master


и GPIO:
Код:
GPIOC->DDR|= 0x68;               //PC3,5,6 выходы. Ост. входы
   GPIOC->CR1|= 0x68;                  //PC3,5,6 PP. Ост. floating
   GPIOC->CR2|= 0x68;                  //PC3,5,6 Fast


По вышеобозначенному алгоритму читаю вот так:
Код:
CSOFF;            //CS OFF
   SPI->CR1|=SPI_CR1_SPE;      //SPI Start
   SPI->DR=adr;                           //отправляем адрес регистра который нужно считать
   while ((SPI->SR&SPI_SR_TXE)==0);   //ждем отправки байта адреса регистра
   SPI->DR=0;                                     //для поддержки тактирования для ответа слева

   while ((SPI->SR&SPI_SR_RXNE)==0);   //ждем приема байта ответа
   spiout=SPI->DR;                                       //считываем байт ответа
   

   while ((SPI->SR&SPI_SR_TXE)==0);   //ждем отправки байта данных
   while ((SPI->SR&SPI_SR_BSY)!=0);   //SPI закончил работу
   SPI->CR1&=~SPI_CR1_SPE;      //SPI Stop
   CSON;                  //CS ON


Данные уходят в Slave, тот отвечает как положено (проверял осцом), в spiout ноль. Заглянул в SPL, по сути, моя запись напрямую в регистры - тоже самое и по корректности и по объему кода, но с SPL у людей вроде как работает.
Ощущение будто считывание происходит раньше чем данные попадают в DR. Перенес строку:
spiout=SPI->DR;
в конец вышеприведенного кода (после подъема ноги CS) - не помогает, возможно нужна ещё большая задержка или что-то ещё не так :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 13 дек 2017, 10:20 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2857
Откуда: КЧР, поселок Нижний Архыз
Вот здесь у меня много всякой всячины под STM8S. В том числе и работа по SPI с LCD 5110 и I2C для SI7005 (как ни странно, куча народу I2C ногодрыгом делает, хотя вдумчивое чтение Errata позволяет сделать это аппаратно).

Главное — не использовать калокуб и вдумчиво читать документацию. Уж на STM8 она достаточно тоненькая, это не STM32F7xx! Насчет этого я dosikus полностью поддерживаю.

P.S. Если явно правильный код приводит к косякам, стоит взять 400-рублевый логанализатор и посмотреть, что же там гуляет (ну или осциллографом). Также стоит внимательно почитать даташит на слейва: возможно, там нужна низкая частота SPI, и он тупо на тактирование при работе, скажем, на 2МГц, не успевает!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 13 дек 2017, 10:46 
Только пришел

Зарегистрирован: 24 июн 2015, 10:06
Сообщения: 6
Eddy_Em писал(а):
Вот здесь у меня много всякой всячины под STM8S.

Спасибо за ссылку. Поизучаю.
Вы видимо не стали читать, что я написал :) Калокубов я никаких не использую и алгоритм как раз в документации вычитал :)
Выше я писал как смотрел осцом, слейв отвечает и отвечает правильно. 2МГц - в несколько раз меньше чем он может, - по даташиту 12,5МГц. Вообщем учитывая вышесказанное, проблема явно на стороне МК, но пока не могу понять в чем. Мой код вам кажется правильным?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 13 дек 2017, 14:36 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 595
Откуда: Киев
На предыдущей странице было показано, как надо.
1) прочитать DR просто так
2) Выдать пустой байт для записи в DR ответа
3) прочитать DR с нужными данными
Код:
  SPI->DR = reg;   //
  while (!(SPI->SR & SPI_SR_TXE));
  SPI->DR = 0;               // dummy data for read
  while (!(SPI->SR & SPI_SR_RXNE));
  (void)SPI->DR;          // read 1 byte (dummy)
  while (SPI->SR & SPI_SR_BSY);
  return (SPI->DR);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 13 дек 2017, 16:27 
Только пришел

Зарегистрирован: 24 июн 2015, 10:06
Сообщения: 6
Спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу Пред.  1, 2

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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