Перейти к содержанию
    

что за DR?

DataRegister ;)

"bufPr1 = SPI2->DR;//Считываем данные из приемного б…"

 

я ведь должен прислать датчику такое чтобы считать? 10111100 (BC) ?

0xBC должен ответить датчик.

 

Синхроимпульсы есть? а как проверить правильно ли выбраны их фронты?

 

Данные SPI-блоком в контроллере могут двигаться по переднему или по заднему фронту синхроимпульсов.

Вот ответ датчика с правильным ID и будет признаком правильной настройки интерфейса.

 

Наличие синхроимпульсов во время плавного спада данных не годится.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пойдем по списку))

смотрел на прямую DR, пишу в него BC (10111100)

1 - чтение

0 - без здвига

111100 - 6 разрядный адрес 0F задом наперед

 

можно как нибудь решить проблему плавного спада?

 

Я домой, дальнейшие пытки датчика продолжатся завтра с 9:00 =)

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стоять!!!!! Назад!!!!!

 

В DR 0xBC писать не надо. Это датчик во втором байте должен вернуть (т.е. процессор вычитать).

Вот примерно так:

post-83663-1435139371_thumb.png

По поводу плавного спада: надо разобраться с исходным уровнем и активным фронтом SCK.

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AD5 AD4.....AD0 они ведь идут задом наперед, не надо ли и адрес в бинарном коде писать задом наперед?

Так ведь чтобы что то передать это что то надо записать в DR, оттуда и считать что пришло, разве нет?

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Шутки шутками, но доку (DS на датчик и контроллер и RefMan на контроллер) - курить до просветления.

 

Данные в датчик должны "вдуваться" старшим (MSB) битом вперёд: R\~Wбит это старший, AD5..AD0 - записаны от старшего к младшему => 10001111b. Зачем это преворачивать?

 

"Так ведь чтобы что то передать это что то надо записать в DR, оттуда и считать что пришло, разве нет?"

Так вы и писали в DR 0x8F при BIDIOE==1, а как этот байт был отправлен, то BIDIOE 1-->0 переключит SPI на приём и автоматически вычитает (R\~W==1 не забыли?) из датчика

данные по только что переданному адресу, их вы увидите тоже в DR.

 

И ещё: если не будет выполнено "This line is driven at the falling edge of SCL and should be captured at the rising edge of SCL." то не правильно будут тактироваться данные.

CPOL, CPHA соответствуют требуемому?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

увидел только что одну проблему, мой код почему то на отправку генерит 16 импульсов, и ничего не генерит на прием, я думал что это 8 на передачу и 8 на прием, а оказалось что на прием воще ничего нет, сейчас пробую другой пример под себя переделать, об успехах отпишусь

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача
SPI2->DR = 0x8F; //Пишем в буфер передатчика SPI1.
while(!(SPI2->SR & SPI_SR_TXE));// Ожидаем окончания передачи данных
SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача

for(uint32_t i=0; i<0x000FFFFF; i++);
//Прием данных.

SPI2->CR1 &= ~ SPI_CR1_BIDIOE; //BIDIOE прием
while(!(SPI2->SR & SPI_SR_RXNE));//приняли данные
bufPr1 = SPI2->DR;//Считываем данные из приемного буфера SPI1. При этой операции происходит очистка буфера и сброс флага RXNE
SPI2->CR1 |= SPI_CR1_BIDIOE; //BIDIOE передача

Ну откуда??? 8 синхроимпульсов от "SPI2->DR = 0x8F" и 8 синхроимпульсов от "SPI2->CR1 &= ~ SPI_CR1_BIDIOE"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну откуда??? 8 синхроимпульсов от "SPI2->DR = 0x8F" и 8 синхроимпульсов от "SPI2->CR1 &= ~ SPI_CR1_BIDIOE"

если бы я знал)) я закоментил все, оставил только отправку, а как было 16 импульсов так и осталось

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если бы я знал)) я закоментил все, оставил только отправку, а как было 16 импульсов так и осталось

 

• 8- or 16-bit transfer frame format selection

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

• 8- or 16-bit transfer frame format selection

но у меня выставлен формат данных 8, и вроде он должен отправлять и принимать по 8 импульсов, но на самом деле как я понял по его работе, он первую половину воспринимает как отправляемое сообщение, а вторую часть как получаемое, короче я воще ничего не понимаю,

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

 

 

Передаю 2A, размер данных 8 бит, прицепил к осцилографу два щупа, и получил вот такое соответствие,

первый такт

второй данные

Такое разве нормально?

post-87107-1435300544_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Меня смущает то, что в даташите на датчик, начало импульсов в шине данных совпадает с падением в шине такта, а у нас с подъёмом, это нормально?

post-87107-1435302181_thumb.jpg

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"но у меня выставлен формат данных 8, и вроде он должен отправлять и принимать по 8 импульсов, но на самом деле как я понял по его работе, он первую половину воспринимает как отправляемое сообщение, а вторую часть как получаемое"

 

Во-первых, кто он?

Во-вторых, первый байт - адрес в датчике, а второй байт - данные (если запись в датчик) или ответ датчика (если чтение из него).

 

"SPI2->DR = 0x8F" команда, дающая передачу первого байта;

"SPI2->CR1 &= ~ SPI_CR1_BIDIOE" команда, дающая прием второго байта.

Если бы надо было записать данные в датчик, то использовалась бы вторая команда "SPI2->DR = 0x**".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

The first bit (bit 0) starts at the first falling edge of SCL after the falling edge

of CS while the last bit (bit 15, bit 23,...) starts at the last falling edge of SCL just before the

rising edge of CS.

Вот выдержка из даташита, которая говорит тоже самое

Можно как то настроить чтобы он не по возрастанию читал линию данных а по падению

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Меня смущает то, что в даташите на датчик, начало импульсов в шине данных совпадает с падением в шине такта, а у нас с подъёмом, это нормально?

 

Данные у вас меняются по заднему фронту SCL, фиксируются по переднему фронту. Всё нормально.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...