фигня какая то с этим КАНом.
Прием на мастере и слейве одинаковый
Код
void USB_LP_CAN1_RX0_IRQHandler(void)
{
can_params.message_received = 1;
can_params.fifo_num = CAN_FIFO0;
CAN_Receive(CANx, CAN_FIFO0, &RxMessage);
}
посылка тоже
Код
uint8_t CAN_TX(uint8_t mot_id, uint8_t opcode, uint8_t *data, uint32_t data_size)
{
uint8_t mailbox_num;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_EXT;
TxMessage.ExtId = (opcode << 8) | mot_id;
if (data_size > 8)
data_size = 8;
TxMessage.DLC = data_size;
memcpy(&TxMessage.Data[0], data, data_size);
mailbox_num = CAN_Transmit(CANx, &TxMessage);
return mailbox_num;
}
мастер посылает
Код
void main (void)
{ while(1)
{
CAN_TX(100, MASTER_COM_WHO_IS, can_data_buf, 0);
}
}
я вижу четкий прием
Код
void CAN_TX_Slave(uint32_t opcode)
{
switch (opcode)
{
//я сюда попадаю
case CAN_COM_WHO_IS :
size = 0;
//посылка ответа
CAN_TX(motor_sys_params.mot_id, CAN_COM_I_AM, data, 0);
break;
}
}
но мастер в прерывание приема не заходит. я ставлю паузу на мастере - и тогда он заходит в прерывание приема.
это что мастер должен освободить шину чтоб получить ответ?
в какой то момент на слейве вдруг TEC = 0xFF REC = 0xFF и он отсыхает несмотря на то что CAN1->BTR |= CAN_BTR_SILM;
Подключил слейв к USB-CAN Plus - это ж просто праздник какой то. посылка прием - все в порядке. почему два камня не могут договориться между собой?
Сообщение отредактировал Jenya7 - Sep 21 2018, 08:33
Эскизы прикрепленных изображений