ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
180644
klen (08.02.2010 20:03, просмотров: 12077)
stm32f107, проблема с CAN2 пробую запустить сразу два модуля CAN сначала решил по одиночке запустить в режиме loopback - проверить генерацию прерываний. написано по образу примера из фирменной библиотеки. функции инициализации и отправки пакета идентичны , принимают параметр CAN1 или CAN2 чтоб выбрать модуль с которым работать. CAN2 не генерит прерываний и не принимает пакет. передачик говорит что все передано CAN_TransmitStatus(CANx, TransmitMailbox) возвращает CANTXOK. Приемник CAN2 тупо ниче нихочет делать че делать? после просмотра подиаганаоли даташита терзают смутные сомнения что CAN1 и CAN2 "две большие разницы" .... вод код инициализации модулей, мутотень с GPIO вырезал void can_init(CAN_TypeDef* CANx) { // активация модуля CAN1 //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); if (CANx==CAN1) RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE); else RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // установка канала CANx_RX0_IRQn контроллера прервыаний NVIC if (CANx==CAN1) NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; else NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // сброс регистров модуля CAN CAN_DeInit(CANx); CAN_InitTypeDef CAN_InitStructure; CAN_StructInit(&CAN_InitStructure); // инициалищация модуля CAN CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; //CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; CAN_InitStructure.CAN_Prescaler = 4;//2 CAN_Init(CANx, &CAN_InitStructure); // инициализация фильтра CAN CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); // разрешение прерыания по приему сообщения в FIFO #0 модуля CAN1 CAN_ITConfig(CANx, CAN_IT_FMP0 , ENABLE); } //--------------------------------------------------------------------------------------- uint32_t can_tx(CAN_TypeDef* CANx , uint8_t* data , uint32_t size) { CanTxMsg TxMessage; uint8_t TransmitMailbox = 0; //подготовка пакета для передачи TxMessage.StdId = 0x321; TxMessage.ExtId = 0x01; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; TxMessage.Data[0] = 0x55; // передача пакета TransmitMailbox=CAN_Transmit(CANx, &TxMessage); uint32_t i = 0xffff; // таймер таймаута по завершении передачи while((CAN_TransmitStatus(CANx, TransmitMailbox) != CANTXOK) && i ) { i--; } if ( !i ) return 0xFFFFFFFF; return size; } //-------------------------------------------------------------------------- void CAN1_RX0_IRQHandler(void) { while(1); // ловим прерывания под отладчиком } void CAN2_RX0_IRQHandler(void) { while(1); // ловим прерывания под отладчиком } для теста вызываются can_init(CAN1); tmp = can_tx( CAN1 , NULL , 32) ; программа зацикливается в обработчике прерывания CAN1_RX0_IRQHandler can_init(CAN2); tmp = can_tx( CAN2 , NULL , 32) ; программа не циклится чек делать кроме чтения даташита который уже читаю? хелп ми