Перейти к содержанию

    

Посылка по CAN в STM32F3

фигня какая то с этим КАНом.

Прием на мастере и слейве одинаковый

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 - это ж просто праздник какой то. посылка прием - все в порядке. почему два камня не могут договориться между собой?

post-71075-1537517870_thumb.png

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не, я понимаю, что читать спецификации не модно, если можно фигачить код и писать вопросы в интернетах...

 

Но, всё-таки

1) чем вы руководствовались при запуске непрерывной передачи без малейших пауз?

2) слышали ли вы что-то о ACK'ах в кан-шине? И если да, то задумывались ли, кто же будет их выдавать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Не, я понимаю, что читать спецификации не модно, если можно фигачить код и писать вопросы в интернетах...

 

Но, всё-таки

1) чем вы руководствовались при запуске непрерывной передачи без малейших пауз?

2) слышали ли вы что-то о ACK'ах в кан-шине? И если да, то задумывались ли, кто же будет их выдавать?

 

вобще то на вехнем уровне я жду ответа от слейва. а кроме того USB-CAN Plus молотит тоже без перерыва однако с ним все нормально.

насчет ACK'а я не понял из документации. это же происходит на автоматическом уровне.

 

и вообще можно без туманностей и напыщенности? а так по нашему по бразильски по человечески.

 

я помню был проект. правда на TI Delfino. но там пять узлов молотили каждый как бог на душу положит без согласований и арбитражей. и ничего. все получали свои пакеты и я не помню чтоб КАН когда то отсох.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
а так по нашему по бразильски по человечески.

По-человечески - возьмите осциллограф или хотя бы лог. анализатор типа клон Saleae Logic.

Возмущений много, а схемы подключения - 0.

Где анализ целостности сигналов?

 

То что принял один - не значит, что примет другой!

 

ФИЗИЧЕСКИ что на линии?

 

--

UPD: Так еще и линия 1 Мбит!

Откуда тактирование? Кварц или RC?

Скорость пробовали уменьшать?

с BTR регистром пробовали играться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
По-человечески - возьмите осциллограф или хотя бы лог. анализатор типа клон Saleae Logic.

Возмущений много, а схемы подключения - 0.

Где анализ целостности сигналов?

 

То что принял один - не значит, что примет другой!

 

ФИЗИЧЕСКИ что на линии?

 

осциллограф показывает обычные пакеты. когда есть ошибки USB-CAN Plus сигнализирует.

 

ну я вообще то вижу правильные данные при принятии. а что 1 Мбит это большая нагрузка на линию?

 

тактирование внешний кварц. а BTR с ST примеров. они точно лучше меня знают как его выставлять.

post-71075-1537540001_thumb.png

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ОК. вроде заработало.

 

настраиваю маску на слейве

    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 = 0x0064;     
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x00FF; 
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);

мастер посылает

TxMessage.ExtId = (opcode << 8) | 0х64;

однако слейв не принимает. без маски и фильтра принимает.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация