STMF4Discovery, SPI и акселерометр.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

У меня по приему проверяются оба флага. TXE и RXNE. И осциллограммы посмотрите. я сейчас задержку еще ввел дополнительную перед тем, как "отпустить" CS. Все равно не работает.. Что догадки-то лепить? Вы говорите, что я ничего не сделал.. Я две недели ковырял эту байду, пытаясь самостоятельно разобраться! Я сам разобрался с Keil, CooCox, ST-Link, с портами в/в, с SPI. И это мой первый вопрос здесь по АРМ. А все только пинают от одного предположения к другому. Хотя бы посмотрите, что сделано, прежде чем пинать.

Вот, еще один..
И тебе уже сказано - проверять RXNE с последующей вычиткой DR - после каждого байта
Да вычищаю я DR! Код смотрите. Первый байт принятый я читаю и отбрасываю, а второй передаю в основную функцию.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Я конечно дико извиняюсь, я смотрел-смотрел на эти потуги и решил сам залезть в reference manual.
В самом первом сообщении приведен код. Там при инициализации SPI имеется строчка:

Код: Выделить всё

 SPI1->CR1 = 0;
CS акселерометра на STMF4Discovery сидит на PE3, т.е. он программный. Значит надо отключить SS от вывода PA4. Я может быть не до конца все сразу сообразил, но в reference manual сказано что за это отвечают биты 8 и 9 регистре CR1. Команда

Код: Выделить всё

SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
примерно это и делает. А у Pink-Pank там нули.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Пробуй , только из даташита следует что читаются 2 байта , а у тебя 1

Код: Выделить всё

void Write_SPI (char addres, char znachenie)
{
   GPIOE->BSRRH = (1<<3);
   addres &= 0x3F;
   while (!(SPI1->SR & SPI_SR_TXE));
   SPI1->DR = addres;
   while (!(SPI1->SR & SPI_SR_TXE));
   SPI1->DR = znachenie;
   while (!(SPI1->SR & SPI_SR_TXE));
  while(SPI1->SR & SPI_SR_BSY);
   GPIOE->BSRRL = (1<<3);


       
}

char Read_SPI (char addres)
{
   GPIOE->BSRRH = (1<<3);
   addres |= 0x80;
   while (!(SPI1->SR &  SPI_SR_TXE));
   SPI1->DR = addres;
   while (!(SPI1->SR &  SPI_SR_TXE));
   SPI1->DR = 0x00;
   while (!(SPI1->SR &  SPI_SR_TXE));
   while(SPI1->SR & SPI_SR_BSY); 
   GPIOE->BSRRL = (1<<3);
   return SPI1->DR;
}
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Пробуй , только из даташита следует что читаются 2 байта , а у тебя 1
Вы смотрите первый пост. Дальше приводится повторно код после исправлений - там есть чтение второго байта
CS акселерометра на STMF4Discovery сидит на PE3, т.е. он программный. Значит надо отключить SS от вывода PA4. Я может быть не до конца все сразу сообразил, но в reference manual сказано что за это отвечают биты 8 и 9 регистре CR1. Команда
Код:
SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
примерно это и делает. А у Pink-Pank там нули.

Код: Выделить всё

SPI1->CR1 |= SSI | SSM;	
Это и есть биты 8 и 9. Где у меня там нули? Если бы там были нули SPI ушел в режим SLAVE и ничего не передавал бы.
Последний раз редактировалось Pink-Pank Вт июн 24, 2014 10:59:37, всего редактировалось 1 раз.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Этот ? И где здесь два байта ?

Код: Выделить всё

char Read_SPI (char addres)
{
   GPIOE->BSRRH = (1<<3); \\ 3-d bit
   __DSB();
   addres |= 0x80;
   while (!(SPI1->SR & (1<<1))); \\ bit TXE
   SPI1->DR = addres;
   while (!(SPI1->SR & (1<<1))); \\ bit TXE
   while (!(SPI1->SR & (1<<0))); \\ bit RXNE
   (void) SPI1->DR;
   SPI1->DR = 0x00;
   while (!(SPI1->SR & (1<<1))); \\ bit TXE
   while (!(SPI1->SR & (1<<0))); \\ bit RXNE
   GPIOE->BSRRL = (1<<3); \\ 3-d bit
   __DSB();
   return SPI1->DR;
}
Это мешанина неосознанная ...
Последний раз редактировалось dosikus Вт июн 24, 2014 11:03:59, всего редактировалось 1 раз.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

где здесь два байта ?

Код: Выделить всё

(void) SPI1->DR;
- это 1 байт

Код: Выделить всё

return SPI1->DR;
- это второй байт

Еще раз повторюсь, SPI у меня работает!
Fucking static initialization order fiasco
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Pink-Pank правда что ли :o ???

И прям 2 байта возвращаются из функции в char - которая к тому же может быть и знаковой. :)))

Повторюсь - нихрена у тебя не работает .
Последний раз редактировалось dosikus Вт июн 24, 2014 11:21:48, всего редактировалось 2 раза.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Pink-Pank писал(а):Все равно не работает.. Что догадки-то лепить? И это мой первый вопрос здесь по АРМ.
Да здесь вопрос по сути не по АРМ... а по SPI... по его работе... АРМ здесь сбоку...
Добейтесь сначала полной передачи с поднятием CS... и байт забирайте после полной транзакции... и получать 0 вы можете потому, что он остался в DR... передачу/приём то оборвали...
RXNE здесь и даром не нужен...
"Я не даю готовых решений, я заставляю думать!"(С)
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

При чем здесь два байта? Я один откидываю сразу, а второй передаю. Топик сначала прочитайте. 1 страницу полностью хотя бы.
Вот осциллограмма. Сверху вниз MOSI, SCK, CS, MISO
Изображение

По MISO не идет передача. Че я снимать буду в SPI? Я получаю не 0, а 0xFF, что полностью соответствует осциллограмме
Вложения
DSC_0880.JPG
(70.77 КБ) 788 скачиваний
Fucking static initialization order fiasco
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Теперь разбирайтесь с протоколом обмена... почему датчик не отсылает данные...
Отсоедините MISO датчика и замкните MISO-MOSI МК... и посмотрите... получаете ли вы 0х00 по return... Для верности вместо 0х00 можно отослать 0xAA... Так проверите работает ли у вас MISO МК...
"Я не даю готовых решений, я заставляю думать!"(С)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

я бы сменил полярность выдачи - я не работал с этим счастьем по спиай, только по и2с, но по картинкам видно, что захват идет по положительному фронту, а вы даете по отрицательному. Гонки и все такое.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

5 баллов! Заработало! Спасибо большое! Урррррааааа!!! :kill:
Fucking static initialization order fiasco
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Сообщение ua1arn »

Ещё в понедельник задавал наводящие вопросы:
Да, к стати - какой SPI MODE требует акселерометр?
Проигнорировали... там всего четыре варианта (а по настоящему - два) перебрать-то надо было.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

А Вам отдельное спасибо! Вы мне тоже очень помогли! ;) А по по поводу настроек - так я ж проверял и не раз.. и был уверен, что все ОК.. а оказалось не ОК
Fucking static initialization order fiasco
Контактная информация:
Ответить

Вернуться в «ARM»