STMF4Discovery, SPI и акселерометр.
У меня, кстати, почему-то после посылки второго байта вывод MOSI переводится в низкий уровень..
А если посылать три байта, то потом остается в высоком уровне..
Попробую прилепить картинки
Fucking static initialization order fiasco
- Реклама
__DSB тут явно лишнее... костыль от недопонимания...ua1arn писал(а):А насчет флагов в SPI - SPI давно инициализирован, чего ждать предлагаете в случае аппаратного SPI и ручного управления выводами порта?
Максимум на что там можно наткнуться это code reordering... Ну так вы сами должны знать риски оптимизации и методы борьбы с этими рисками...
У меня включена максимальная оптимизация по скорости в GCC (не ради ногодрыга, просто как DSP работает - так что вводу-выводу достаётся тоже оптимизации), когда всё что можно инлайнится благодаря lto, при использовании ST SPL на это не наткнетесь...
Это имеет какое-то значение???Pink-Pank писал(а):У меня, кстати, почему-то после посылки второго байта вывод MOSI переводится в низкий уровень..А если посылать три байта, то потом остается в высоком уровне..
Попробую прилепить картинки
"Я не даю готовых решений, я заставляю думать!"(С)
Код в Keil.Pink-Pank писал(а):Это у Вас в Кокосе код? Я посмотрел, у мня тоже самое, только в регистры сам пишу, но не работает.. (( У Вас, кстати, ошибка. Операция WRITE должна устанавливать старший бит в 0, а READ - в 1. Вы же и там и там пишете | READ или | WRITE. Для WRITE нужно что-то типа & (~READ)) тогда будет сбрасывать старший бит.
А ничего что у меня:
Код: Выделить всё
#define READ 0x80
#define WRITE 0x00Давайте Ваш вариант решения проблемы, или не делайте таких заявлений. Напоминаю - исходное - настроенный SPI master, 9 МГц (или больше), программно опускаем CS и выдаём значение в SPIx->DR, наблюдаем формирующийся клок и с задержкой переходящий в "0" сигнал выбора.__DSB тут явно лишнее... костыль от недопонимания...
Вот картинки:

Сверху вниз MOSI, SCK, CS, MISO
Сверху вниз MOSI, SCK, CS, MISO
Я это прекрасно видел. И пример работающий, но некорректный. Смысл тогда был городить | WRITE (| 0x00) Если у Вас там всегда ноль? С логическими операциями у меня порядокКод в Keil.
А ничего что у меня:
Код:
#define READ 0x80
#define WRITE 0x00
а в адресах регистров 7-й бит всегда 0? Таким образом операция АДРЕС РЕГИСТРА | WRITE в 7-м бите всегда даст 0, а операция АДРЕС РЕГИСТРА | READ - всегда 1. Думаете я вам кинул не работающий пример? Вам бы не только с SPI, а еще и с логическими операциями разобраться...
- Вложения
-
- 20140624_101844.jpg
- (233.94 КБ) 967 скачиваний
Последний раз редактировалось Pink-Pank Вт июн 24, 2014 09:56:21, всего редактировалось 2 раза.
Fucking static initialization order fiasco
- Реклама
Решение одно... читайте даташит, а не создавайте видимость... Уже надоел весь этот бред про SPI STM32... всё там сделано просто и мощно...ua1arn писал(а):Давайте Ваш вариант решения проблемы, или не делайте таких заявлений.
Там некоторые флаги устанавливаются не сразу, а спустя два цикла... причём не два цикла тактирования ядра, а два цикла тактирования периферии... и ваша __DSB в данном случае просто играет роль задержки... и в некоторых случаях это просто не спасёт...
По поводу заявлений... это ваши измышления ничем не подкреплены, кроме витиеватых костылей наобум... а я уже выкладывал эпюры и девятого бита ногодрыгом (70% от мах) и 18-бит SPI (100% от мах) на простом STM32F100...
"Я не даю готовых решений, я заставляю думать!"(С)
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Решение твоей "проблемы", описано мной на предыдущей странице .ua1arn писал(а): Давайте Ваш вариант решения проблемы,
Ну что ты такой упертый? Это для тебя грабли - для остальных давным-давно все пройдено.ua1arn писал(а): или не делайте таких заявлений.
Здесь так же софтовый ногодрыг CS :

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

Заметьте - я не про окончание передачи, после которого снимается CS и распространены проблемы у тех, кто на флаги не смотрит (или не на те что надо).всё там сделано просто и мощно...
Там некоторые флаги устанавливаются не сразу, а спустя два цикла... причём не два цикла тактирования ядра, а два цикла тактирования периферии... и ваша __DSB в данном случае просто играет роль задержки... и в некоторых случаях это просто не спасёт...
Я про начало передачи - и не на STM32F1xx, а на STM32F4xx. Скриншоты с осциллографа и демонстрирующий проблему код с меня чуть позже.
Мля! Моей проблемой кто-нить займется? Задолбали письками меряться! И нахрена такая помощь?
Fucking static initialization order fiasco
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Скрины выше с F4 ...ua1arn писал(а): Я про начало передачи - и не на STM32F1xx, а на STM32F4xx. Скриншоты с осциллографа и демонстрирующий проблему код с меня чуть позже.
Pink-Pank , тебя носом тыкать ? На предыдущую страницу загляни .
Кстати - шлем 1 байт , почему фрейм 16 бит ?
Остальной инит SPI - так же сплошное бездумное тырканье...
Для читабельности кода. Согласитесь что запись | WRITE куда яснее говорит что это операция записи чем & (~READ)). Все таки для ARM имеется возможность писать очень наглядный и легко читабельный код, используя CMSIS. Я большинство времени пишу коды для AVR, так что для Cortex я стараюсь писать максимально наглядный код без использования прямой записи в регистры без крайней необходимости. Опять таки CMSIS это позволяет делать. Но это на любителя, многим "нравится" через год-другой разбираться наново в собственном коде.Pink-Pank писал(а):И пример работающий, но некорректный. Смысл тогда был городить | WRITE (| 0x00) Если у Вас там всегда ноль?
Последний раз редактировалось eess9 Вт июн 24, 2014 09:55:29, всего редактировалось 1 раз.
С чего Вы взяли, что фрейм 16 бит? у меня на 8 бит стоит
Fucking static initialization order fiasco
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Pink-Pank, хз , подумалось из-за эпюр .
Ну а остальное так и будешь игнорировать?
Ну а остальное так и будешь игнорировать?
Так а что не так-то? Задержку после опускания CS в ноль и после конца передачи по SPI перед установкой CS в 1 я ввел.. Передача работает как надо, а вот ответа нет..
Fucking static initialization order fiasco
Где??? Не тупи!!!Pink-Pank писал(а):Передача работает как надо, а вот ответа нет..
Приведи текст по минимуму... наведи порядок - без магических чисел... тогда и будем разбираться, а так... не видно движения навстречу и желания что-то делать...
Вот отправляешь ты два байта... юзаешь RXNE... Как ты думаешь... после отправки первого байта RXNE станет в 1... в чём смысл всех последующих проверок, если RXNE у тебя встал навечно??? В каких случаях RXNE сбрасывается... что на эту тему говорит даташит???
"Я не даю готовых решений, я заставляю думать!"(С)
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
RXNE сбрасывается когда буфер опустошается. Буфер я опустошаю.HHIMERA писал(а): Вот отправляешь ты два байта... юзаешь RXNE... Как ты думаешь... после отправки первого байта RXNE станет в 1... в чём смысл всех последующих проверок, если RXNE у тебя встал навечно??? В каких случаях RXNE сбрасывается... что на эту тему говорит даташит???
Посмотрите на мои осциллограммы! У меня ответ с акселерометра не приходит. Другое дело, если бы он приходил, а я его прочитать не смог.
Акселерометр заведомо рабочий. (стояла заводская прошивка и плата реагировала на изменения углов наклона)
Fucking static initialization order fiasco
Может быть... я с пульта TV текст набиваю... и не помню нумерацию битов!!!dosikus писал(а):он вообще TXE пользует :![]()
"Я не даю готовых решений, я заставляю думать!"(С)
Потому что CS'ом обрывается передача...Pink-Pank писал(а):У меня ответ с акселерометра не приходит.
Перед поднятием CS вставьте проверку BUSY... окончание передачи...Потому что ТXE меняется через два такта после начала предачи... что не является условием окончания передачи...
"Я не даю готовых решений, я заставляю думать!"(С)
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Ты предлагаешь нам вручную расшифровывать ?Pink-Pank писал(а): Посмотрите на мои осциллограммы!
И тебе уже сказано - проверять RXNE с последующей вычиткой DR - после каждого байта
Или как Стас пишет - с Busy


