|
|
|
|
@@ -6,6 +6,7 @@ struct controlflags ControlFlags;
|
|
|
|
|
|
|
|
|
|
CAN_HandleTypeDef *_HCAN = 0;
|
|
|
|
|
RTC_HandleTypeDef *_HRTC = 0;
|
|
|
|
|
TIM_HandleTypeDef *_HTIM = 0;
|
|
|
|
|
|
|
|
|
|
uint8_t CurrentStep = 1;
|
|
|
|
|
uint8_t LastStep = 0;
|
|
|
|
|
@@ -35,25 +36,61 @@ uint16_t AvailableCanRxMsg(void)
|
|
|
|
|
return ((uint16_t)(CAN_RX_BUFFER_SIZE + (LastStep - CurrentStep + 1)))%CAN_RX_BUFFER_SIZE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PROTOCAN_DEINIT(uint8_t stage)
|
|
|
|
|
{
|
|
|
|
|
switch(stage) {
|
|
|
|
|
case 3:
|
|
|
|
|
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
|
|
|
|
|
HAL_TIM_UnRegisterCallback(_HTIM, HAL_TIM_PERIOD_ELAPSED_CB_ID);
|
|
|
|
|
#endif
|
|
|
|
|
case 2:
|
|
|
|
|
case 1:
|
|
|
|
|
#if (USE_HAL_CAN_REGISTER_CALLBACKS == 1)
|
|
|
|
|
HAL_CAN_UnRegisterCallback(_HCAN, HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Инициализация переферии
|
|
|
|
|
* @details Инициализация указателей на HCAN, HRTC, установка фильтров CAN.
|
|
|
|
|
* @note Фильтры CAN описаны в разделе PROTOCAN_CAN_FILTERS().
|
|
|
|
|
*/
|
|
|
|
|
PROTOCAN_INIT_StatusTypeDef PROTOCAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_HandleTypeDef *tmp_hrtc)
|
|
|
|
|
PROTOCAN_INIT_StatusTypeDef PROTOCAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_HandleTypeDef *tmp_hrtc, TIM_HandleTypeDef *tmp_tim)
|
|
|
|
|
{
|
|
|
|
|
//HAL_CAN_Start(_HCAN);
|
|
|
|
|
//HAL_CAN_ActivateNotification(_HCAN, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_ERROR | CAN_IT_BUSOFF | CAN_IT_LAST_ERROR_CODE);
|
|
|
|
|
//MX_TIM4_Init();
|
|
|
|
|
//MX_RTC_Init();
|
|
|
|
|
if(tmp_hcan)
|
|
|
|
|
unsigned initStage = 0;
|
|
|
|
|
if(tmp_hcan) {
|
|
|
|
|
_HCAN = tmp_hcan;
|
|
|
|
|
else
|
|
|
|
|
#if (USE_HAL_CAN_REGISTER_CALLBACKS == 1)
|
|
|
|
|
HAL_CAN_RegisterCallback(_HCAN, HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID, ProtoCanRxFifo0MsgPendingCallback);
|
|
|
|
|
#endif
|
|
|
|
|
} else {
|
|
|
|
|
PROTOCAN_DEINIT(initStage);
|
|
|
|
|
return PROTOCAN_HCAN_ERROR;
|
|
|
|
|
if(tmp_hrtc)
|
|
|
|
|
}
|
|
|
|
|
initStage++;
|
|
|
|
|
if(tmp_hrtc) {
|
|
|
|
|
_HRTC = tmp_hrtc;
|
|
|
|
|
else
|
|
|
|
|
} else {
|
|
|
|
|
PROTOCAN_DEINIT(initStage);
|
|
|
|
|
return PROTOCAN_HRTC_ERROR;
|
|
|
|
|
}
|
|
|
|
|
initStage++;
|
|
|
|
|
if(tmp_tim) {
|
|
|
|
|
_HTIM = tmp_tim;
|
|
|
|
|
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
|
|
|
|
|
HAL_TIM_RegisterCallback(_HTIM, HAL_TIM_PERIOD_ELAPSED_CB_ID, ProtoCanPulseCallback);
|
|
|
|
|
#endif
|
|
|
|
|
} else {
|
|
|
|
|
PROTOCAN_DEINIT(initStage);
|
|
|
|
|
return PROTOCAN_TIM_ERROR;
|
|
|
|
|
}
|
|
|
|
|
initStage++;
|
|
|
|
|
PROTOCAN_FILTERS();
|
|
|
|
|
ControlFlags.IsPulse = 1;
|
|
|
|
|
return PROTOCAN_OK;
|
|
|
|
|
@@ -65,6 +102,7 @@ PROTOCAN_INIT_StatusTypeDef PROTOCAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_Handl
|
|
|
|
|
* Обработка запроса аналоговых значений - PROTOCAN_AnalogProcessing().
|
|
|
|
|
* Обработка широковещательных запросов - PROTOCAN_BroadcastProcessing().
|
|
|
|
|
* Обработка запроса дискретных значений - PROTOCAN_DiscreticProcessing().
|
|
|
|
|
* Обработка запроса к общему адресному пространству - PROTOCAN_GeneralAddressSpace_Answer().
|
|
|
|
|
* Обработка Modbus - PROTOCAN_ModbusProcessing().
|
|
|
|
|
*/
|
|
|
|
|
void PROTOCAN_LOOP(void)
|
|
|
|
|
@@ -831,7 +869,7 @@ void TakeRxMsgToBuffer(extID tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR, uint32
|
|
|
|
|
* Читает все сообщения из FIFO, проверяет их тип, обновляет статус устройств сети или сохраняет сообщение в буфер.
|
|
|
|
|
* @param hcan Указатель на структуру управления CAN-Hardware.
|
|
|
|
|
*/
|
|
|
|
|
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
|
|
|
|
void ProtoCanRxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
|
|
|
|
{
|
|
|
|
|
//Обработка всех сообщений в FIFO
|
|
|
|
|
CAN_RxHeaderTypeDef RxHeader;
|
|
|
|
|
@@ -869,7 +907,7 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
|
|
|
|
* @brief Функция отправки пульса устройства.
|
|
|
|
|
* @details Пульс устройства. Есть возможность отключить пульс по запросу.
|
|
|
|
|
*/
|
|
|
|
|
void PROTOCAN_Pulse_TIM_Handler()
|
|
|
|
|
void ProtoCanPulseCallback(TIM_HandleTypeDef *htim)
|
|
|
|
|
{
|
|
|
|
|
if(ControlFlags.IsPulse)
|
|
|
|
|
{
|
|
|
|
|
|