реклама на сайте
подробности

 
 
> stm32 uart kline 5baud slow init, помогите плиз
aneox
сообщение May 14 2015, 17:46
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



Для начала диалога с автомобильным эбу нужно передать 0х13 на скорости 5бод, на авр все реализовал и прекрано работает

Код
Serial1.end();
  pinMode(txPin, OUTPUT);
  
  digitalWrite(txPin, HIGH);  
  delay(300);                //W5          
  digitalWrite(txPin, LOW);  //start bit
  delay(200);              
  digitalWrite(txPin, HIGH); // 1 1
  delay(400);                  
  digitalWrite(txPin, LOW); // 0 0
  delay(400);                      
  digitalWrite(txPin, HIGH); // 1
  delay(200);                          
  digitalWrite(txPin, LOW); // 0 0 0
  delay(600);                              
  digitalWrite(txPin, HIGH);  
  delay(200);               //W1                                  
  Serial1.begin(9600);

дальше все гуд



терь задача сделать на 105м стме, сил моих больше нет

Код
void kline(void *pvParameters)
{
    static TickType_t xLastWakeTime;
    UNUSED(pvParameters);

    xLastWakeTime = xTaskGetTickCount();

    for(;;)
    {
        if(!ecuInit)
        {
            if (!slowInit)
            {
                kline_Serial_End();
                vTaskDelay(10);

                GPIO_SetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 300);
                GPIO_ResetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 200);
                GPIO_SetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 400);
                GPIO_ResetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 400);
                GPIO_SetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 200);
                GPIO_ResetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 600);
                GPIO_SetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 200);

                kline_Serial_Start();

                uint32_t timeout = 0;
                while (!slowInit)
                {
                    timeout++;
                    if (timeout >  10)//0xAfffff)
                        break;
                }
                if (!slowInit)
                {
//                    kline_Reset_Pin();
//                    kline_Serial_End();
//                    GPIO_SetBits(GPIOC, GPIO_Pin_10);
                    vTaskDelay(5000);
                    slowInit = 0;
//                  пауза и пробуем снова
                }
            }


Код
void kline_Serial_End(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    USART_DeInit(UART4);
    USART_Cmd(UART4, DISABLE);
    USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);

    klineRecieveIndex = 0;


}

void kline_Serial_Start(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);//UART4

    USART_DeInit(UART4);
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(UART4, &USART_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_Cmd(UART4, ENABLE);
    USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
}


Код
void UART4_IRQHandler()
{
    uint8_t data;
//    portBASE_TYPE xStatus;

    if((UART4->SR & USART_SR_RXNE))
    {

      data = UART4->DR;

      klineRecieveBuffer[klineRecieveIndex] = data;

      if (klineRecieveIndex > 48)
          klineRecieveIndex = 0;
      else
          klineRecieveIndex++;

      if (!slowInit)
      {
          if (data == 0x8F)
          {
              Usart_Send_symbol(0x70, KLINE_UART);
              klineRecieveIndex = 0;
          }

          if (data == 0xEC)
          {
              slowInit = 1;
              klineRecieveIndex = 0;
          }

                  if(USART_GetITStatus(UART4, USART_SR_ORE) == SET)
                  {
                       USART_ReceiveData(UART4);
                   }
}

      }



Вообщем пару раз прилетает после первой попытки FF и все, при повторных молчок. Железка точно работает, на ноги стм тыкаю авку и она успешно коннектится к эбу. Трансивер стшный 9637

в ответ на бит банг эбу должен отвечать 55 E9 8F , но приходит FF FF, полагаю что битбанг успешно отрабатывает, проблема в приеме

возможно чтото с частотами напутал, мож тут косяк подскажите
Код
void SetSysClockTo72(void)
{
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------*/
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  if (RCC_WaitForHSEStartUp() == SUCCESS)
  {

    FLASH_SetLatency(FLASH_Latency_2);
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div2);

    RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);

    RCC_PLLCmd(ENABLE);

    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    while (RCC_GetSYSCLKSource() != 0x08)
    {
    }


Сообщение отредактировал aneox - May 14 2015, 17:30
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение May 15 2015, 09:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
и уже в прерывание уарт не входит

что значит не выходит? То есть символы идут а прерывания нет? Или символы тоже не идут?

Вряд ли процессор перестает работать, скорее всего вы что-то выключили и забыли включить. Что вы делаете для переинита системы?
Go to the top of the page
 
+Quote Post
aneox
сообщение May 15 2015, 12:07
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



Цитата(Golikov A. @ May 15 2015, 10:19) *
что значит не выходит? То есть символы идут а прерывания нет? Или символы тоже не идут?

Вряд ли процессор перестает работать, скорее всего вы что-то выключили и забыли включить. Что вы делаете для переинита системы?

прерывание не срабатывает я имел ввиду, данные идут на линии, а прерывания нет. для переинита использую вот этот код
Код
kline_Serial_End();
                vTaskDelay(100);

                GPIO_SetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 300);
                GPIO_ResetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 200);
                GPIO_SetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 400);
                GPIO_ResetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 400);
                GPIO_SetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 200);
                GPIO_ResetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 600);
                GPIO_SetBits(GPIOC, GPIO_Pin_10);
                vTaskDelayUntil(&xLastWakeTime, 200);

                kline_Serial_Start();


mr_smit стесняюсь спросить, неужели не видно задержки тут ? vTaskDelayUntil(&xLastWakeTime, 300);

в тех двух функциях и видны таймауты по 5сек, в первых постах есть ведь код

Сообщение отредактировал aneox - May 15 2015, 12:23
Go to the top of the page
 
+Quote Post
mr_smit
сообщение May 15 2015, 12:53
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 22-07-09
Пользователь №: 51 457



Цитата(aneox @ May 15 2015, 16:07) *
mr_smit стесняюсь спросить, неужели не видно задержки тут ? vTaskDelayUntil(&xLastWakeTime, 300);

Вы уже столько кода привели что в каждую строчку не вникнешь. Я говорил про саму идею реализации. Где возможны грабли. Если вы это всё уже учли, то это хорошо. Надо дальше искать.

P.S. Тем не менее не понимаю почему бы не подключить бортовик к зажиганию и не морочить дальше голову.

Сообщение отредактировал mr_smit - May 15 2015, 12:57
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- aneox   stm32 uart kline 5baud slow init   May 14 2015, 17:46
- - kolobok0   Цитата(aneox @ May 14 2015, 20:46) Для на...   May 14 2015, 18:46
- - aneox   Спасибо за ответ) Просто опыта не хватает, первый ...   May 14 2015, 18:54
|- - kolobok0   Цитата(aneox @ May 14 2015, 21:54) ...Спа...   May 14 2015, 19:30
- - aneox   так, ну проблема всетаки есть. обясню чтобы получ...   May 14 2015, 21:40
- - mr_smit   Авто какое?   May 15 2015, 03:57
|- - aneox   Цитата(mr_smit @ May 15 2015, 04:57) Авто...   May 15 2015, 04:11
- - mr_smit   В обработчике прерывания от USART надо сбрасывать ...   May 15 2015, 04:20
- - aneox   спасибо, но на сколько я знаю, считывания байта из...   May 15 2015, 04:31
- - mr_smit   Да, подзабыл. ЦитатаRXNE - This bit is set by hard...   May 15 2015, 05:34
- - aneox   отправку из прерывания убрал еще вчера, сегодня во...   May 15 2015, 07:55
|- - mr_smit   Цитата(Golikov A. @ May 15 2015, 13:19) ч...   May 15 2015, 10:34
- - Rash   есть ещё и другая особенность, при вкл. зажигания ...   May 15 2015, 10:44
- - Golikov A.   а ну все правильно написано, все должно работать))...   May 15 2015, 12:40
- - Golikov A.   проверяйте функции DeInit она там тактирование слу...   May 15 2015, 12:57


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016