|
|
  |
STM32F4 USART посылка данных, Не отсылаются все байты |
|
|
|
May 26 2013, 18:04
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
вот моя настройка УСАРТ: CODE uint32_t config_usart3(void) {
//============================================================================= // USART3 Related configuration //============================================================================= // enable clock RCC->APB1ENR |= RCC_APB1ENR_USART3EN;
// 1) Setting UE, amd M bits USART3-> CR1 |= 0x2000; // UE = 1
// 2) Programming number of stop bits if needed
// 3) Enable DMA if needed
// 4) set the Baud Rate // BAUD = fck / ( 8 * (2 - OVER8) * USARTDIV ) // fck = 42MHz, // OVER8 = 0 // Choose BAUD = 115200 // then: USARTDIV = fck / ( 8 * (2 -OVER8) * BAUD = 22.75 // BRR = (22 << 4) | ( 0.75 * 16) = 364, // or: BRR = fck / BAUD = 42MHz / 115200 = 364 USART3->BRR = 364;
// enable transmitter USART3->CR1 |= USART_CR1_TE;
// enable receiver USART3->CR1 |= USART_CR1_RE;
return 0; } а вот собственно код отсылки: CODE uint8_t mem_read_gyro(USART_TypeDef *USART_ID ) {
int i=0; // loop var
//send read buffer to USART for(i=0;i<=17281024;i++) { // check if TXE bit is set while((!(USART_ID->SR & USART_SR_TXE)) );
USART_ID->DR = 0x5d;//mem_gyro_buf[i]; // sending a byte // check if TC bit is set while((!(USART_ID->SR & USART_SR_TC)) ); }
return 0; } как видите проверяю TC и TXE, цикл ожидания бесконечный, так что если с битами была бы проблема код застрял бы на цикле. Но в моем случае вся функция исполняыется в коде успешно, но когда проверяю на компе то программа регистрирует меньшее количество байт например: 15 547 966(столько же байт и вижу в бинарном файле), а должно 17 281 024 байт. причем интерестно то, что количество полученных байт постоянно разное, но всегда меньше чем 17 281 024 байт. в чем тут еще может быть проблема? вот настройки терминала: Baud:115200 DataSize: 8 parity: none Handshake: off mode: freeчто тут еще может быть нетак?
Сообщение отредактировал IgorKossak - May 26 2013, 18:27
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
May 26 2013, 21:00
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
я решил проверить какое минимальное количество байт посылается без проблем, так вот до 500 000 байт когда посылаю то доходят все, сли скажемпошлю 600 000 байт то я теряю байты. я решил внедрить функцию CTS/RTS на стм32, ну и включил ее в программе терминала. так вот, опять не получается послать надежно даже 600 000 байт. теперь я заметил почемуто что принимаю всегда именно 597 953 байт! вместо 600 000 байт вот конфигурация порта: CODE //============================================================================= // GPIOD configuration //============================================================================= // enable GPIOD clock ((RCC_TypeDef *)(RCC_BASE))->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
// Alternate Function ((GPIO_TypeDef *)(GPIOD_BASE))->MODER |= (GPIO_MODER_MODER9_1 | // Alternate Function, USART3_RX GPIO_MODER_MODER8_1 | // Alternate Function, USART3_TX GPIO_MODER_MODER11_1 | // Alternate Function, USART3_CTS GPIO_MODER_MODER12_1 // Alternate Function, USART3_RTS );
// Output type GPIOD->OTYPER = 0; //((GPIO_TypeDef *)(GPIOD_BASE))->OTYPER |= //0;// push-pull if 0 //( //GPIO_OTYPER_OT_11 // Open-Drain, I2C1, SCL ////GPIO_OTYPER_OT_9 // OPen-Drain, I2C1, SDA //);
// Speed type ((GPIO_TypeDef *)(GPIOD))->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR8_1 | // USART3 TX 50 MHz GPIO_OSPEEDER_OSPEEDR9_1 | // USART3 RX 50 MHz GPIO_OSPEEDER_OSPEEDR11_1 | // USART3 CTS 50 MHz GPIO_OSPEEDER_OSPEEDR12_1 // USART3 RTS 50 MHz );
// Push/Pull for USART3 GPIOD->PUPDR = 0; ((GPIO_TypeDef *)(GPIOD_BASE))->PUPDR |= ( GPIO_PUPDR_PUPDR8_0 | // Pull-Up, USART3 TX GPIO_PUPDR_PUPDR9_0 | // Pull-Up, USART3 RX GPIO_PUPDR_PUPDR11_0 | // Pull-Up, USART3 CTS GPIO_PUPDR_PUPDR12_0 // Pull-Up, USART3 RTS );
((GPIO_TypeDef *)(GPIOD_BASE))->AFR[1] |= ( (7 << ((8 - 8) << 2)) | // USART3 TX, AF7 (7 << ((9 - 8) << 2)) | // USART3 RX, AF7 (7 << ((11 - 8) << 2)) | // USART3 CTS, AF7 (7 << ((12 - 8) << 2)) // USART3 RTS, AF7 );
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
May 27 2013, 06:11
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
я сейчас сделал именно так как вы сказали, соеденил ножки 2-3, затем я создал один файл с количеством 600 001 байт.
и в терминальной программе (правда без режима CTS/RTS, но на той же скорости 115200) прогнал этот файл, а взамен получил 593 857 байт, это делает гдето 6 144 байт разницу.
дело в том что когда посылал данные с стм32 то я получал когда как, иногда все 600 001 а иногда: 591 809 593 857 (как в случае с тестом) 597 953 итд.
т.е. выходит так и есть? причина не в моем коде или каком то неверном методе отправки данных с стм32, а просто то что буфер компа/переходника переполнен?
мне просто нужно много байт (32МБайт примерно) отослать на комп, то что долго ничего, главное чтобы каждый байт до единого пришел.
какой тогда метод будет относительно надежен для отправки большого количества данных с стм32 по УСАРТУ? например отправлять 256 байт и ждать? если да то сколько времени примерно ждать надо (так чтобы на многих компах работало)?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
May 27 2013, 06:20
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(BlackOps @ May 27 2013, 10:11)  я сейчас сделал именно так как вы сказали, соединил ножки 2-3, затем я создал один файл с количеством 600 001 байт. и в терминальной программе (правда без режима CTS/RTS, но на той же скорости 115200) прогнал этот файл, а взамен получил 593 857 байт, это делает гдето 6 144 байт разницу. А с контролем RTS/CTS такой же результат? Или Xon/Xoff? Цитата какой тогда метод будет относительно надежен для отправки большого количества данных с стм32 по УСАРТУ? например отправлять 256 байт и ждать? если да то сколько времени примерно ждать надо (так чтобы на многих компах работало)? Без контроля потока будет ненадежно.
|
|
|
|
|
May 27 2013, 07:33
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(BlackOps @ May 27 2013, 10:36)  замкнул контрольные пины тоже, проверил, с контролем потока тоже самое(иногда пересылаются все 600 001 байт, а в основном конечноже не все)... это нормально? Нет, не нормально. Цитата разве когда этот FTDI кабель работает в режиме замкнутом - Эхо, и в режиме контроля потока он не должен ждать пока его буфера освободятся перед тем как самому себе вновь новые данные отсылать? Может это связано с терминальной программой? Например, гипертерминал вообще ничего не принимает и не передает, если включен аппаратный контроль, а сами выводы RTS/CTS не подключены. Xon/Xoff режим не пробовали?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|