Obam 37 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба что за DR? DataRegister ;) "bufPr1 = SPI2->DR;//Считываем данные из приемного б…" я ведь должен прислать датчику такое чтобы считать? 10111100 (BC) ? 0xBC должен ответить датчик. Синхроимпульсы есть? а как проверить правильно ли выбраны их фронты? Данные SPI-блоком в контроллере могут двигаться по переднему или по заднему фронту синхроимпульсов. Вот ответ датчика с правильным ID и будет признаком правильной настройки интерфейса. Наличие синхроимпульсов во время плавного спада данных не годится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BooSooV 0 24 июня, 2015 Опубликовано 24 июня, 2015 (изменено) · Жалоба Пойдем по списку)) смотрел на прямую DR, пишу в него BC (10111100) 1 - чтение 0 - без здвига 111100 - 6 разрядный адрес 0F задом наперед можно как нибудь решить проблему плавного спада? Я домой, дальнейшие пытки датчика продолжатся завтра с 9:00 =) Изменено 25 июня, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 24 июня, 2015 Опубликовано 24 июня, 2015 (изменено) · Жалоба Стоять!!!!! Назад!!!!! В DR 0xBC писать не надо. Это датчик во втором байте должен вернуть (т.е. процессор вычитать). Вот примерно так: По поводу плавного спада: надо разобраться с исходным уровнем и активным фронтом SCK. Изменено 25 июня, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BooSooV 0 25 июня, 2015 Опубликовано 25 июня, 2015 (изменено) · Жалоба AD5 AD4.....AD0 они ведь идут задом наперед, не надо ли и адрес в бинарном коде писать задом наперед? Так ведь чтобы что то передать это что то надо записать в DR, оттуда и считать что пришло, разве нет? Изменено 25 июня, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 25 июня, 2015 Опубликовано 25 июня, 2015 · Жалоба Шутки шутками, но доку (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 соответствуют требуемому? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BooSooV 0 25 июня, 2015 Опубликовано 25 июня, 2015 (изменено) · Жалоба увидел только что одну проблему, мой код почему то на отправку генерит 16 импульсов, и ничего не генерит на прием, я думал что это 8 на передачу и 8 на прием, а оказалось что на прием воще ничего нет, сейчас пробую другой пример под себя переделать, об успехах отпишусь Изменено 25 июня, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 25 июня, 2015 Опубликовано 25 июня, 2015 · Жалоба 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" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BooSooV 0 25 июня, 2015 Опубликовано 25 июня, 2015 (изменено) · Жалоба Ну откуда??? 8 синхроимпульсов от "SPI2->DR = 0x8F" и 8 синхроимпульсов от "SPI2->CR1 &= ~ SPI_CR1_BIDIOE" если бы я знал)) я закоментил все, оставил только отправку, а как было 16 импульсов так и осталось Изменено 25 июня, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 25 июня, 2015 Опубликовано 25 июня, 2015 · Жалоба если бы я знал)) я закоментил все, оставил только отправку, а как было 16 импульсов так и осталось • 8- or 16-bit transfer frame format selection Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BooSooV 0 26 июня, 2015 Опубликовано 26 июня, 2015 · Жалоба • 8- or 16-bit transfer frame format selection но у меня выставлен формат данных 8, и вроде он должен отправлять и принимать по 8 импульсов, но на самом деле как я понял по его работе, он первую половину воспринимает как отправляемое сообщение, а вторую часть как получаемое, короче я воще ничего не понимаю, запустил код на Дискавери, думал может что разведено не так,а один фиг при некоторых комбинациях вижу плавный спад Передаю 2A, размер данных 8 бит, прицепил к осцилографу два щупа, и получил вот такое соответствие, первый такт второй данные Такое разве нормально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 26 июня, 2015 Опубликовано 26 июня, 2015 · Жалоба А что не так? 00101010b==0x2A старшим битом вперёд. Всё нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BooSooV 0 26 июня, 2015 Опубликовано 26 июня, 2015 (изменено) · Жалоба Меня смущает то, что в даташите на датчик, начало импульсов в шине данных совпадает с падением в шине такта, а у нас с подъёмом, это нормально? Изменено 26 июня, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 26 июня, 2015 Опубликовано 26 июня, 2015 · Жалоба "но у меня выставлен формат данных 8, и вроде он должен отправлять и принимать по 8 импульсов, но на самом деле как я понял по его работе, он первую половину воспринимает как отправляемое сообщение, а вторую часть как получаемое" Во-первых, кто он? Во-вторых, первый байт - адрес в датчике, а второй байт - данные (если запись в датчик) или ответ датчика (если чтение из него). "SPI2->DR = 0x8F" команда, дающая передачу первого байта; "SPI2->CR1 &= ~ SPI_CR1_BIDIOE" команда, дающая прием второго байта. Если бы надо было записать данные в датчик, то использовалась бы вторая команда "SPI2->DR = 0x**". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BooSooV 0 26 июня, 2015 Опубликовано 26 июня, 2015 · Жалоба 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. Вот выдержка из даташита, которая говорит тоже самое Можно как то настроить чтобы он не по возрастанию читал линию данных а по падению Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 26 июня, 2015 Опубликовано 26 июня, 2015 · Жалоба Меня смущает то, что в даташите на датчик, начало импульсов в шине данных совпадает с падением в шине такта, а у нас с подъёмом, это нормально? Данные у вас меняются по заднему фронту SCL, фиксируются по переднему фронту. Всё нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться