Jump to content

Zombie47

Members
  • Content Count

    202
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Zombie47

  • Rank
    Постоялец

Информация

  • Пол
    Мужчина
  • Город
    Санкт-Петербург

Электроника

  • Стаж в электронике
    Менее года

Recent Profile Visitors

1752 profile views
  1. Наверно мне бы стоило в вопросах для начинающих задать этот вопрос, но с другой стороны у меня уже это все давно работает, хоть я не знаю как))) Среда MicroC Pro У меня МК PIC16F1847 с кварцем 20Mhz, к нему подключен по SPI MCP2510 с кварцем 8Mhz а к нему MCP2551 Вот у меня в коде что то вроде стандартной конфигурации CAN SPI void CANinit(void){ Can_Init_Flags = 0; Can_Send_Flags = 0; // clear flags Can_Rcv_Flags = 0; // Can_Send_Flags = _CANSPI_TX_PRIORITY_0 & // form value to be used _CANSPI_TX_STD_FRAME & // with CANSPIWrite _CANSPI_TX_NO_RTR_FRAME; Can_Init_Flags = _CANSPI_CONFIG_SAMPLE_THRICE & // Form value to be used _CANSPI_CONFIG_PHSEG2_PRG_ON & // with CANSPIInit _CANSPI_CONFIG_STD_MSG & _CANSPI_CONFIG_DBL_BUFFER_ON & _CANSPI_CONFIG_VALID_STD_MSG; //SPI1_Init(); // initialize SPI1 module CANSPIInitialize(1,1,3,3,1,Can_Init_Flags); // Initialize external CANSPI module CANSPISetOperationMode(_CANSPI_MODE_CONFIG,0xFF); // set CONFIGURATION mode CANSPISetMask(_CANSPI_MASK_B1,-1,_CANSPI_CONFIG_STD_MSG); // set all mask1 bits to ones CANSPISetMask(_CANSPI_MASK_B2,-1,_CANSPI_CONFIG_STD_MSG); // set all mask2 bits to ones CANSPISetFilter(_CANSPI_FILTER_B2_F3,ID_1st,_CANSPI_CONFIG_STD_MSG); // set id of filter B2_F3 to 1st node ID áåç ýòîé ñòðîêè íå ðàáîòàåò CANSPISetFilter(_CANSPI_FILTER_B2_F4,ID_2nd,_CANSPI_CONFIG_STD_MSG); // set id of filter B2_F3 to 1st node ID áåç ýòîé ñòðîêè íå ðàáîòàåò CANSPISetFilter(_CANSPI_FILTER_B1_F2,ID_3rd,_CANSPI_CONFIG_STD_MSG); // set id of filter B2_F3 to 1st node ID áåç ýòîé ñòðîêè íå ðàáîòàåò CANSPISetFilter(_CANSPI_FILTER_B2_F1,ID_4th,_CANSPI_CONFIG_STD_MSG); // set id of filter B2_F3 to 1st node ID áåç ýòîé ñòðîêè íå ðàáîòàåò CANSPISetOperationMode(_CANSPI_MODE_NORMAL,0xFF); } Не очень уже помню как и где это настраивается, но скорость работы у меня 500 000 байт в секунду вроде, ну или какие там единицы. Не хочу перегружать вопрос кучей кода поэтому буду вырезать главное чтобы было читабельно. В основном юзаю отправку например вот: zaderzka=180; //величина задержки 9765 это 1 сек. 190 задержка это 0.019сек zaderzka_flag=1; if (i>zaderzka) { CANSPIWrite(ID_512, RxTx_Data512, 8, Can_Send_Flags); RxTx_Data512[5]++;//счетчик от 00 до FF } Вопросы и проблемы: 1. я формирую задержку таймером, который запускаю флагом в коде, и я эту задержку использую для отправки в SPI шину, там проходит время по посылке в SPI и тд, поэтому тайминг отправки CAN не точный и плавает. А мне надо чтобы непосредственно MCP2510 слал мой пакет в шину с определенным таймингом как это сделать? 2. в шине есть еще устройства, они тоже шлют в шину пакеты со своим таймингом. Вообщем иногда я вижу очень редко пакеты встречаются, но контроллер MCP2510 вроде как рулит чтобы не было нахлеста. По идее хорошо бы чтобы каждое устройство попадало в свой тайминг, но я не могу выдержать отправку раз в 20мсек. у меня плавает туда сюда то 25 то 22 то 26 и тд, и поэтому встречаются места там где пересекаются пакеты и как я вижу по счетчикам, один пакет у меня просто теряется, а другой пакет который я шлю почему то шлется два три раза подряд, именно MCP2510 так как счетчик без изменений то-есть программа не сделала цикла. 3. Как вообще настраивается прием сообщений? как я понял настройкой фильтров типо этого: CANSPISetFilter(_CANSPI_FILTER_B2_F1,ID_4th,_CANSPI_CONFIG_STD_MSG); Тоесть я правильно понимаю что всего там ограниченное количество фильтров которое я могу использовать на прием?
  2. где взять эту функцию? USART_ClearITPendingBit где взять это USART_IT_RXNE у меня этого просто нету. я понимаю что второе это регистр, но он где то должен быть определен. а у меня нигде не определен и как это сделать я не пойму.
  3. такого нет впринципе.
  4. Значит так флаг поднялся. Сработало прерывание, и обработчик прерываний? вызвался каллбэк? А как переконфигурировать сначала в ногу на выход а потом в ногу уарта? я переконфигурирую и у меня впринципе прием перестает работать
  5. Спасибо теперь понятнее стало почему так работает. Вообщем вопрос в следующем, как запретить поднимать эти флаги прерывания на прием пока я отправляю?
  6. да это понятно, но я же уже отправил, все , ниче не должно быть в приеме дублироваться.
  7. и еще вопрос, почему не работает этот код. у меня стоит драйвер, который параллелит при отправке RX и TX ну вроде как эхо называется. поэтому пишу вот так: HAL_UART_Abort_IT (&huart1);//запрет прерываний по приему. HAL_UART_Transmit(&huart1, &start_posilka_abs, 1, 30); //отправляю 1 байт HAL_UART_Receive_IT(&huart1, (uint8_t*)buffers_first, 1);//запускает прием по уарту как токо придут все байты будут приняты сработает прерывание каллбэк каждый цикл срабатывает каллбэк на прием. но я же вроде как запретил прием.
  8. Исходные данные проц: STM32L053R8 работаю с HAL мне надо ногу PA9 сначала подергать вручную, а потом чтоб она была уартом. я решил делать так: конфигурирую как ногу на выход: /*Configure GPIO pins : PA9 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); дергаю ногой: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET); HAL_Delay (582);// это будет 582 задержка HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_SET); HAL_Delay (158);// это будет 158 задержка HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET); HAL_Delay (24); // это будет 24 задержка очень чувствительно. ставлю 25 перестает работать. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_SET); HAL_Delay (24);// это будет 24 задержка конфигурирую как уарт: // ниже конфигурирую пин PA9 опять как уарт GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); отправляю: HAL_UART_Transmit(&huart1, &start_posilka_abs, 1, 30); //отправляю 1 байт принимаю: HAL_UART_Receive_IT(&huart1, (uint8_t*)buffers_first, 1);//запускает прием по уарту как токо придут все байты будут приняты сработает прерывание каллбэк вообщем вроде все работает кроме одного, перестает работать прием ) перестают работать прерывания на прием.
×
×
  • Create New...