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

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

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

У меня, кстати, почему-то после посылки второго байта вывод MOSI переводится в низкий уровень.. :dont_know: А если посылать три байта, то потом остается в высоком уровне.. :shock: Попробую прилепить картинки
Fucking static initialization order fiasco
Контактная информация:
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ua1arn писал(а):А насчет флагов в SPI - SPI давно инициализирован, чего ждать предлагаете в случае аппаратного SPI и ручного управления выводами порта?
__DSB тут явно лишнее... костыль от недопонимания...

У меня включена максимальная оптимизация по скорости в GCC (не ради ногодрыга, просто как DSP работает - так что вводу-выводу достаётся тоже оптимизации), когда всё что можно инлайнится благодаря lto, при использовании ST SPL на это не наткнетесь...
Максимум на что там можно наткнуться это code reordering... Ну так вы сами должны знать риски оптимизации и методы борьбы с этими рисками...
Pink-Pank писал(а):У меня, кстати, почему-то после посылки второго байта вывод MOSI переводится в низкий уровень.. :dont_know: А если посылать три байта, то потом остается в высоком уровне.. :shock: Попробую прилепить картинки
Это имеет какое-то значение???
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Pink-Pank писал(а):Это у Вас в Кокосе код? Я посмотрел, у мня тоже самое, только в регистры сам пишу, но не работает.. (( У Вас, кстати, ошибка. Операция WRITE должна устанавливать старший бит в 0, а READ - в 1. Вы же и там и там пишете | READ или | WRITE. Для WRITE нужно что-то типа & (~READ)) тогда будет сбрасывать старший бит.
Код в Keil.
А ничего что у меня:

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

#define READ				0x80 
#define WRITE				0x00
а в адресах регистров 7-й бит всегда 0? Таким образом операция АДРЕС РЕГИСТРА | WRITE в 7-м бите всегда даст 0, а операция АДРЕС РЕГИСТРА | READ - всегда 1. Думаете я вам кинул не работающий пример? Вам бы не только с SPI, а еще и с логическими операциями разобраться...
Встал на лапы
Аватара пользователя
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Сообщение ua1arn »

__DSB тут явно лишнее... костыль от недопонимания...
Давайте Ваш вариант решения проблемы, или не делайте таких заявлений. Напоминаю - исходное - настроенный SPI master, 9 МГц (или больше), программно опускаем CS и выдаём значение в SPIx->DR, наблюдаем формирующийся клок и с задержкой переходящий в "0" сигнал выбора.
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

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

Вот картинки:
Изображение
Сверху вниз MOSI, SCK, CS, MISO
Код в Keil.
А ничего что у меня:
Код:
#define READ 0x80
#define WRITE 0x00

а в адресах регистров 7-й бит всегда 0? Таким образом операция АДРЕС РЕГИСТРА | WRITE в 7-м бите всегда даст 0, а операция АДРЕС РЕГИСТРА | READ - всегда 1. Думаете я вам кинул не работающий пример? Вам бы не только с SPI, а еще и с логическими операциями разобраться...
Я это прекрасно видел. И пример работающий, но некорректный. Смысл тогда был городить | WRITE (| 0x00) Если у Вас там всегда ноль? С логическими операциями у меня порядок
Вложения
20140624_101844.jpg
(233.94 КБ) 967 скачиваний
Последний раз редактировалось Pink-Pank Вт июн 24, 2014 09:56:21, всего редактировалось 2 раза.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ua1arn писал(а):Давайте Ваш вариант решения проблемы, или не делайте таких заявлений.
Решение одно... читайте даташит, а не создавайте видимость... Уже надоел весь этот бред про SPI STM32... всё там сделано просто и мощно...
Там некоторые флаги устанавливаются не сразу, а спустя два цикла... причём не два цикла тактирования ядра, а два цикла тактирования периферии... и ваша __DSB в данном случае просто играет роль задержки... и в некоторых случаях это просто не спасёт...
По поводу заявлений... это ваши измышления ничем не подкреплены, кроме витиеватых костылей наобум... а я уже выкладывал эпюры и девятого бита ногодрыгом (70% от мах) и 18-бит SPI (100% от мах) на простом STM32F100...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

ua1arn писал(а): Давайте Ваш вариант решения проблемы,
Решение твоей "проблемы", описано мной на предыдущей странице .
ua1arn писал(а): или не делайте таких заявлений.
Ну что ты такой упертый? Это для тебя грабли - для остальных давным-давно все пройдено.
Здесь так же софтовый ногодрыг CS :

Изображение

И снова повторюсь - это для однобайтовых посылок , как верно Стас выше пишет - для потоковых/блочных другая проверка/телодвижения...


Изображение
Встал на лапы
Аватара пользователя
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Сообщение ua1arn »

всё там сделано просто и мощно...
Там некоторые флаги устанавливаются не сразу, а спустя два цикла... причём не два цикла тактирования ядра, а два цикла тактирования периферии... и ваша __DSB в данном случае просто играет роль задержки... и в некоторых случаях это просто не спасёт...
Заметьте - я не про окончание передачи, после которого снимается CS и распространены проблемы у тех, кто на флаги не смотрит (или не на те что надо).
Я про начало передачи - и не на STM32F1xx, а на STM32F4xx. Скриншоты с осциллографа и демонстрирующий проблему код с меня чуть позже.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

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

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

Сообщение dosikus »

ua1arn писал(а): Я про начало передачи - и не на STM32F1xx, а на STM32F4xx. Скриншоты с осциллографа и демонстрирующий проблему код с меня чуть позже.
Скрины выше с F4 ...

Pink-Pank , тебя носом тыкать ? На предыдущую страницу загляни .
Кстати - шлем 1 байт , почему фрейм 16 бит ?
Остальной инит SPI - так же сплошное бездумное тырканье...
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Pink-Pank писал(а):И пример работающий, но некорректный. Смысл тогда был городить | WRITE (| 0x00) Если у Вас там всегда ноль?
Для читабельности кода. Согласитесь что запись | WRITE куда яснее говорит что это операция записи чем & (~READ)). Все таки для ARM имеется возможность писать очень наглядный и легко читабельный код, используя CMSIS. Я большинство времени пишу коды для AVR, так что для Cortex я стараюсь писать максимально наглядный код без использования прямой записи в регистры без крайней необходимости. Опять таки CMSIS это позволяет делать. Но это на любителя, многим "нравится" через год-другой разбираться наново в собственном коде.
Последний раз редактировалось eess9 Вт июн 24, 2014 09:55:29, всего редактировалось 1 раз.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

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

С чего Вы взяли, что фрейм 16 бит? у меня на 8 бит стоит
Fucking static initialization order fiasco
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Pink-Pank, хз , подумалось из-за эпюр .
Ну а остальное так и будешь игнорировать?
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

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

Так а что не так-то? Задержку после опускания CS в ноль и после конца передачи по SPI перед установкой CS в 1 я ввел.. Передача работает как надо, а вот ответа нет..
Fucking static initialization order fiasco
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Pink-Pank писал(а):Передача работает как надо, а вот ответа нет..
Где??? Не тупи!!!
Приведи текст по минимуму... наведи порядок - без магических чисел... тогда и будем разбираться, а так... не видно движения навстречу и желания что-то делать...
Вот отправляешь ты два байта... юзаешь RXNE... Как ты думаешь... после отправки первого байта RXNE станет в 1... в чём смысл всех последующих проверок, если RXNE у тебя встал навечно??? В каких случаях RXNE сбрасывается... что на эту тему говорит даташит???
"Я не даю готовых решений, я заставляю думать!"(С)
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Стас , он вообще TXE пользует : :)))

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

while (!(SPI1->SR & (1<<1)));
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

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

HHIMERA писал(а): Вот отправляешь ты два байта... юзаешь RXNE... Как ты думаешь... после отправки первого байта RXNE станет в 1... в чём смысл всех последующих проверок, если RXNE у тебя встал навечно??? В каких случаях RXNE сбрасывается... что на эту тему говорит даташит???
RXNE сбрасывается когда буфер опустошается. Буфер я опустошаю.
Посмотрите на мои осциллограммы! У меня ответ с акселерометра не приходит. Другое дело, если бы он приходил, а я его прочитать не смог.
Акселерометр заведомо рабочий. (стояла заводская прошивка и плата реагировала на изменения углов наклона)
Fucking static initialization order fiasco
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

dosikus писал(а):он вообще TXE пользует : :)))
Может быть... я с пульта TV текст набиваю... и не помню нумерацию битов!!!
"Я не даю готовых решений, я заставляю думать!"(С)
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Pink-Pank писал(а):У меня ответ с акселерометра не приходит.
Потому что CS'ом обрывается передача...
Перед поднятием CS вставьте проверку BUSY... окончание передачи...Потому что ТXE меняется через два такта после начала предачи... что не является условием окончания передачи...
"Я не даю готовых решений, я заставляю думать!"(С)
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Pink-Pank писал(а): Посмотрите на мои осциллограммы!
Ты предлагаешь нам вручную расшифровывать ?
И тебе уже сказано - проверять RXNE с последующей вычиткой DR - после каждого байта

Или как Стас пишет - с Busy
Ответить

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