Ребята, помогите, пожалуйста разобраться, что не так.
Пытаюсь запустить CAN в нормальном режиме ( в loopback работает)
на stm32f4 в среде CodeBlock на библиотеке libopencm3 (ибо именно оно и надо - хотя оч ненависто)
После того, как использует все ящики - зависает.
Почему данные не уходят из почтовых ящиков?
Второе устройство на шине имеется.
Может я не сбрасываю какой-то флаг? Или неправильно настройки?
Инициализация
CODE
uint32_t _canConfig(uint32_t bitrate)
{
int prescaler = 0;
switch(bitrate)
{
case 500:
prescaler = 2; //500kb/s=2000ns
break;
case 250:
prescaler = 4; //250kb/s=4000ns
break;
case 125:
prescaler = 8; //125kb/s=8000ns
break;
case 100:
prescaler = 10; //100kb/s=10000ns
break;
case 50:
prescaler = 20; //50kb/s=20000ns
break;
case 20:
prescaler = 50; //20kb/s=50000ns
break;
case 10:
prescaler = 100; //10kb/s=100000ns
break;
default:
prescaler = 2; //500kb/s=2000ns
break;
}
//CANRX поставлено nopull по аналогии с халом
rcc_periph_clock_enable(CAN_RX_PERIPH);
gpio_mode_setup(CAN_RX_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, CAN_RX_PIN);
gpio_set(CAN_RX_PORT, CAN_RX_PIN);
//CANTX
rcc_periph_clock_enable(CAN_TX_PERIPH);
gpio_mode_setup(CAN_TX_PORT, GPIO_MODE_AF|GPIO_OSPEED_50MHZ, GPIO_OTYPE_PP, CAN_TX_PIN);
//CANmodul
rcc_periph_clock_enable(CAN_PERIPH);
nvic_enable_irq(NVIC_CAN1_RX0_IRQ);
nvic_set_priority(NVIC_CAN1_RX0_IRQ, 1);
can_reset(CAN_NUM);
if(can_init(CAN1,
false, //TTCM: Time triggered comm mode?
false, //ABOM: Automatic bus-off management?
false, //AWUM: Automatic wakeup mode?
false, //NART: No automatic retransmission?
false, //RFLM: Receive FIFO locked mode?
false, //TXFP: Transmit FIFO priority?
CAN_BTR_SJW_1TQ,
CAN_BTR_TS1_9TQ,
CAN_BTR_TS2_6TQ,
prescaler, //BRP+1: Baud rate prescaler
false, //LOOPBACK?
false) == 1) //SILENT?
{
return 1;
}
//CAN filter 0 init
can_filter_id_mask_32bit_init(
0, // Filter ID - принимать все
0, // CAN ID
0, // CAN ID mask
0, // FIFO assignment (here: FIFO0)
true); // Enable the filter
//Enable CAN RX interrupt
can_enable_irq(CAN1, CAN_IER_FMPIE0);
{
int prescaler = 0;
switch(bitrate)
{
case 500:
prescaler = 2; //500kb/s=2000ns
break;
case 250:
prescaler = 4; //250kb/s=4000ns
break;
case 125:
prescaler = 8; //125kb/s=8000ns
break;
case 100:
prescaler = 10; //100kb/s=10000ns
break;
case 50:
prescaler = 20; //50kb/s=20000ns
break;
case 20:
prescaler = 50; //20kb/s=50000ns
break;
case 10:
prescaler = 100; //10kb/s=100000ns
break;
default:
prescaler = 2; //500kb/s=2000ns
break;
}
//CANRX поставлено nopull по аналогии с халом
rcc_periph_clock_enable(CAN_RX_PERIPH);
gpio_mode_setup(CAN_RX_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, CAN_RX_PIN);
gpio_set(CAN_RX_PORT, CAN_RX_PIN);
//CANTX
rcc_periph_clock_enable(CAN_TX_PERIPH);
gpio_mode_setup(CAN_TX_PORT, GPIO_MODE_AF|GPIO_OSPEED_50MHZ, GPIO_OTYPE_PP, CAN_TX_PIN);
//CANmodul
rcc_periph_clock_enable(CAN_PERIPH);
nvic_enable_irq(NVIC_CAN1_RX0_IRQ);
nvic_set_priority(NVIC_CAN1_RX0_IRQ, 1);
can_reset(CAN_NUM);
if(can_init(CAN1,
false, //TTCM: Time triggered comm mode?
false, //ABOM: Automatic bus-off management?
false, //AWUM: Automatic wakeup mode?
false, //NART: No automatic retransmission?
false, //RFLM: Receive FIFO locked mode?
false, //TXFP: Transmit FIFO priority?
CAN_BTR_SJW_1TQ,
CAN_BTR_TS1_9TQ,
CAN_BTR_TS2_6TQ,
prescaler, //BRP+1: Baud rate prescaler
false, //LOOPBACK?
false) == 1) //SILENT?
{
return 1;
}
//CAN filter 0 init
can_filter_id_mask_32bit_init(
0, // Filter ID - принимать все
0, // CAN ID
0, // CAN ID mask
0, // FIFO assignment (here: FIFO0)
true); // Enable the filter
//Enable CAN RX interrupt
can_enable_irq(CAN1, CAN_IER_FMPIE0);
Прерывание на получение данных мне пока не нужно, но вот
Код
void can1_rx0_isr(void)
{
can_fifo_release(CAN1, 0);
}
{
can_fifo_release(CAN1, 0);
}
и в мейне отправка по-тупому
Код
while (1)
{
time++;
if(time>1000000)
{
can_transmit(CAN1, 0x00, 0, 0,8, datat);
time=0;
}
{
time++;
if(time>1000000)
{
can_transmit(CAN1, 0x00, 0, 0,8, datat);
time=0;
}
В чем может быть проблема? Эта libopen... такая гадость... понимаю, что кейл+куб лучше
да я и не против. Но задача стоит именно на этих средствах сделать.
ХЕЛП