STM32F303 + гироскоп WT901 , не читает с нужного регистра

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Сообщение Enigm »

Пытаюсь подружить STM32F303 и WT901 по I2C шине.
Не хотит читать с нужного регистра.
Читает не известно с какого адреса , но что бы добраться до нужных мне данных, надо прочитать больше 150 байт.
код
Спойлерvoid GYRO_READ_I2C2(uint8_t HardSlaveAddr, uint16_t ExtSlaveAddress,uint8_t NumBytes, uint8_t *buf)
{
int DataNum = 0;
I2C2->CR2 = (1<<16) | (HardSlaveAddr<<1);
while (!(I2C2->ISR & I2C_ISR_TXE) );
I2C2->TXDR = ExtSlaveAddress;
I2C2->CR2 |= I2C_CR2_START;
while (!(I2C2->ISR & I2C_ISR_TC) ){};
I2C2->CR2 = I2C_CR2_AUTOEND | (NumBytes<<16) |
(HardSlaveAddr<<1) |
I2C_CR2_RD_WRN |
I2C_CR2_NACK;
I2C2->CR2 |= I2C_CR2_START;
while(DataNum != NumBytes)
{
while(LL_I2C_IsActiveFlag_RXNE(I2C2) == RESET){};
buf[DataNum] = LL_I2C_ReceiveData8(I2C2);
DataNum++;
}
while(LL_I2C_IsActiveFlag_STOP(I2C2) == RESET){};
LL_I2C_ClearFlag_STOP(I2C2);
}


Вызов GYRO_READ_I2C2 (0x50,0x3D,6,rd_value); //Адрес гироскопа, адрес регистра,количество байт
Картинка с анализатора
Изображение
В анализаторе стоит 8бит.
Делал для того что бы сравнить с картинкой из даташита.
Вот она.
Изображение
Не могу понять что не хватает.
Гироскоп отзывается, и передает свои данные, но не берет номер регистра, откуда читать.
Вот даташит на гироскоп, нужное на 47 странице документа
1.PDF
(2.69 МБ) 359 скачиваний
Может кто что подскажет ?
СТМ занялся не давно многое еще не понятно.
И на F3 мало примеров.
А на этот гироскоп, все примеры для уарта, для I2C не нашел.
screenshot.png
(10.13 КБ) 325 скачиваний
Реклама
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Enigm",url="/forum/viewtopic.php?p=3708510#p3708510"]Не могу понять что не хватает.
Гироскоп отзывается, и передает свои данные, но не берет номер регистра, откуда читать.[/uquote]На Ваших осциллограммах видно, что из фазы записи в фазу чтения Вы переходите выполняя на шине СТОП, затем СТАРТ.
На картинках из даташита (хоть там очень мелко и трудно разобрать), но судя по всему переход там выполняется выполнением на шине ПОВТОРНОГО СТАРТА (или ещё это называют - РЕСТАРТ).
Разные I2C-чипы немного по-разному отрабатывают такие переходы. Некоторым всё равно: и СТОП-СТАРТ-ом переходят в чтение, и ПОВТОРНЫМ СТАРТОМ. Но другие чипы требуют совершенно конкретной операции (или СТОП-СТАРТ или ПОВТОРНЫЙ СТАРТ). Которая обычно явно указывается в даташите. В этом даташите вроде не находится явного указания, но на картинке показан похоже ПОВТОРНЫЙ СТАРТ. Попробуйте выполнить его.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Сообщение Enigm »

Вроде и через релоад пробовал, не заводилось совсем, повисал при отправке адреса на чтение.
Попробую еще раз помучать.
Так вроде покрупнее.
Изменение размера 11.jpg
(74.09 КБ) 318 скачиваний
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Сообщение Enigm »

Спасибо за пинок в нужную сторону.
Я чет рестарт с релоадом попутал, поэтому и не получалось
Изменил строку в такой вид
I2C2->CR2 = I2C_CR2_AUTOEND | (NumBytes<<16) |
(HardSlaveAddr<<1) | I2C_CR2_START |
I2C_CR2_RD_WRN |
I2C_CR2_NACK;
И все заработало как надо.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Периферия»