klen (08.02.2010 20:03, просмотров: 12575)
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) ;
программа не циклится
чек делать кроме чтения даташита который уже читаю?
хелп ми