PROGCONT.RU

Вход Регистрация
О САЙТЕ ГЛАВНАЯ
 

STM8S настройка и обмен информации по шине CAN с помощью SPL.

 Данная статья будет посвящена только контроллерам STM8S208 потому что только у них имеется модуль CAN из всего семейства STM8S, так что не ошибитесь с выбором контроллера для использования данного интерфейса.
 Начнем изучение данной темы, сразу с практики но закончим описанием основных функций SPL для настройки и иcпользования модуля CAN, ниже выложена схема подключение двух устройств которые будут соединены между собой с помощью готовых модулей трансивер( приемопередатчик) на микросхеме TJA1050, одно устройство будет конечно контроллер STM8S208RB.

нет рисунка

 В примере ниже выполнена полная настройка CAN для работы в готовом устройстве, показана настройка выводов, банков фильтров, прием сообщений, отправка сообщений с проверкой отправки. Для первого пуска я настроил программу в режим тестирования используется режим CAN_Mode_Silent_LoopBack и вставил в комментарии код для проверки принятых данных CAN через UART, который можете раскомментировать и проконтролировать прием данных через программу терминал.
 Программа работает следующим образом, в основном теле через паузу отправляются сообщения для отработки каждого фильтра и сразу принимаем их в прерывании, если будете использовать UART то на экране программы терминала будут выводится номер фильтра, идентификатор и один байта информации.
 Если проверка работы CAN пройдет удачно, тогда можно подключить устройства по схеме которая выложена выше и переправить режим работы с CAN_Mode_Silent_LoopBack на CAN_Mode_Normal тогда модуль CAN будет подключен к внешним выводам контроллера, и будет работать полный анализ ошибок связи в модуле.

#include "stm8s.h"
void Pause( uint32_t tim);
int main( void){
CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV2);
/*Настройка UART для проверки CAN.
UART1_Init( 115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_Cmd( ENABLE);
UART.*/
//Настройка выводов CAN RX и TX.
GPIO_Init( GPIOG, GPIO_PIN_1, GPIO_MODE_IN_FL_NO_IT);
GPIO_Init( GPIOG, GPIO_PIN_0, GPIO_MODE_OUT_OD_HIZ_FAST);
//Сброс всех настроек CAN или возвращение в состояние по умолчанию.
CAN_DeInit();
//Объявление переменной для настройки CAN.
CAN_MasterCtrl_TypeDef CAN_MasterCtrl;
CAN_Mode_TypeDef CAN_Mode;
CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth;
CAN_BitSeg1_TypeDef CAN_BitSeg1;
CAN_BitSeg2_TypeDef CAN_BitSeg2;
uint8_t CAN_Prescaler;
//Заполняем переменную нужными параметрами.
CAN_MasterCtrl= CAN_MasterCtrl_AllDisabled;
//Режим для теста.
CAN_Mode= CAN_Mode_Silent_LoopBack;
//Режим для готового устройства.
//CAN_Mode= CAN_Mode_Normal;
CAN_SynJumpWidth= CAN_SynJumpWidth_1TimeQuantum;
CAN_BitSeg1= CAN_BitSeg1_2TimeQuantum;
CAN_BitSeg2= CAN_BitSeg2_3TimeQuantum;
CAN_Prescaler= 48;
//Применение настроек.
CAN_Init( CAN_MasterCtrl, CAN_Mode, CAN_SynJumpWidth, CAN_BitSeg1, CAN_BitSeg2, CAN_Prescaler);
//Объявление переменных для настройки банков фильтров.
CAN_FilterNumber_TypeDef CAN_FilterNumber;
FunctionalState CAN_FilterActivation;
CAN_FilterMode_TypeDef CAN_FilterMode;
CAN_FilterScale_TypeDef CAN_FilterScale;
uint32_t ID_Filter;
uint32_t Mask_Filter;
//Настраиваем банк 0, один фильтр для приёма идентификаторов со значением до 8.
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_32Bit;
ID_Filter=0;
Mask_Filter=16376;//BIN 11111111111000.
CAN_FilterInit( CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, CAN_FilterScale, ( uint8_t)( ID_Filter>>3), ( uint8_t)( ID_Filter<<5), 0, 0, ( uint8_t)( Mask_Filter>>3), ( uint8_t)( Mask_Filter<<5), 0, 0);
//Настраиваем банк 1, будет два фильтр для приёма сообщений с идентификаторами 8 и 9.
CAN_FilterNumber = CAN_FilterNumber_1;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterScale = CAN_FilterScale_32Bit;
ID_Filter=8; //Первый ID.
Mask_Filter=9; //Второй ID.
CAN_FilterInit( CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, CAN_FilterScale, ( uint8_t)( ID_Filter>>3), ( uint8_t)( ID_Filter<<5), 0, 0, ( uint8_t)( Mask_Filter>>3), ( uint8_t)( Mask_Filter<<5), 0, 0);
//Включаем прерывание от приема данных.
CAN_ITConfig( CAN_IT_FMP, ENABLE);
enableInterrupts();
//Структура для отправки данных.
CAN_Id_TypeDef Tx_IDE= CAN_Id_Standard;
CAN_RTR_TypeDef Tx_RTR= CAN_RTR_Data;
uint32_t Tx_Id = 7;
uint8_t Tx_DLC = 1;
//Массив с данными.
uint8_t Tx_Data[8]= { 64, 0, 0, 0 , 0, 0, 0, 0};

while(1){
//Переменная для номера отправляющего почтового ящика.
uint8_t mail_box;
Pause( 200000);
//Отправляем сообщение с ID 7.
CAN_Transmit( Tx_Id, Tx_IDE, Tx_RTR, Tx_DLC, Tx_Data);
Pause( 200000);
//Отправляем сообщение с ID 8, и ждём когда сообщение уйдет.
mail_box= CAN_Transmit( 8, Tx_IDE, Tx_RTR, Tx_DLC, Tx_Data);
while( CAN_TransmitStatus( ( CAN_TransmitMailBox_TypeDef)(mail_box))!=CAN_TxStatus_Ok);
//Отправляем сообщение с ID 9, и ждём когда сообщение уйдет.
mail_box= CAN_Transmit( 9, Tx_IDE, Tx_RTR, Tx_DLC, Tx_Data);
while( CAN_TransmitStatus( ( CAN_TransmitMailBox_TypeDef)(mail_box))!=CAN_TxStatus_Ok);
}
return 0;
}

//Обработчик прерывания от приёма сообщений.
INTERRUPT_HANDLER( CAN_RX_IRQHandler, 8)
{
CAN_Receive( );
uint8_t fmi= CAN_GetReceivedFMI( );
uint32_t id= CAN_GetReceivedId( );
uint8_t data_0= CAN_GetReceivedData( 0);
/*Отправляем по UART fmi( номер фильтра), id( идентификатор), data_0( один байт данных).
UART1_SendData8( fmi);
while(!UART1_GetFlagStatus( UART1_FLAG_TXE));
UART1_SendData8( (uint8_t)( id));
while(!UART1_GetFlagStatus( UART1_FLAG_TXE));
UART1_SendData8( data_0);
while(!UART1_GetFlagStatus( UART1_FLAG_TXE));
UART.*/
}
void Pause( uint32_t tim){ for( uint32_t t=tim; t>0; t--);}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line){
while (1){}
}
#endif


Описание функций SPL для настройки CAN модуля и банков фильтров.

CAN_DeInit( )-функция сбрасывает все настройки модуля CAN, рекомендуется выполнять всегда перед началом его настройкой.

CAN_InitStatus CAN_Init( CAN_MasterCtrl, CAN_Mode, CAN_SynJumpWidth, CAN_BitSeg1, CAN_BitSeg2, CAN_Prescaler)-основная функция настройки CAN, возвращает CAN_InitStatus:
 CAN_InitStatus_Failed-ошибка инициализации;
 CAN_InitStatus_Success-удачная инициализация.
 На вход получает параметры, описание которых ниже.
CAN_MasterCtrl-переменная для основных параметров работы модуля, должна быть объявлена как CAN_MasterCtrl_TypeDef, возможные варианты:
 CAN_MasterCtrl_AllDisabled-отключены все ниже перечисленные параметры;
 CAN_MasterCtrl_AllEnabled-включает все ниже перечисленные параметры;
 CAN_MasterCtrl_TimeTriggerCOMMode-включение триггера захвата времени, у модуля имеется специальный шестнадцатибитный регистр который начинает автоматически прибавляться отчитывая время одного бита обмена информации после включения CAN. Если данный параметр включен то перед отправкой сообщения или принятия будет осуществляться захват результата специального шестнадцатибитного регистра, который можно прочесть или автоматически отправить с данными, все это применяется для контроля транзакции.
 CAN_MasterCtrl_AutoBusOffManagement-включает автоматическое отключение шины после переполнения счетчика ошибок, другой вариант программно.
 CAN_MasterCtrl_AutoWakeUpMode-включает автоматический выход модуля из сна после обнаружения на шине активности, другой вариант программно.
 CAN_MasterCtrl_NoAutoReTx-отключение автоматической повторной отправки сообщений если не удалось отправить с первого раза, другой вариант сообщения будут повторно отправляться.
 CAN_MasterCtrl_RxFifoLockedMode-включает блокировку принимающего буфера FIFO от перезаписи, иначе буфер будет перезаписываться новыми сообщениями при его переполнении.
 CAN_MasterCtrl_TxFifoPriority-включает отправку сообщений по порядку если их несколько в буфере, иначе будут отправлять по приоритету идентификатора( чем меньше значение идентификатора тем выше приоритет).
Если нужно включить несколько настроек то накладываем их друг на друга с помощью битовой операции -или- как в примере ниже.
 CAN_MasterCtrl= ( CAN_MasterCtrl_TypeDef)( CAN_MasterCtrl_NoAutoReTx| CAN_MasterCtrl_AutoBusOffManagement);

CAN_Mode-режим работы модуля CAN, объявляется как CAN_Mode_TypeDef, возможные варианты:
 CAN_Mode_Normal-отправляются, принимаются данные и выполняется контроль ошибок, обычный режим работы;
 CAN_Mode_LoopBack-режим предназначен для самотестирования отправляет и сам принимает свои данные, вывод TX подсоединен внутри контроллера к RX поэтому отсутствует контроль ошибок, RX не подключен к шине CAN. Так как вывод TX подключен к шине другие устройства могут контролировать передачи;
 CAN_Mode_Silent-в этом режиме устройство выступает в качестве слушателя линии CAN, подключен к шине только вывод RX, устройство влиять на обнаружение ошибок не может из за не подключенного TX;
 CAN_Mode_Silent_LoopBack-устройство полностью отключено от шины CAN, используется для самотестирования без влияния на линию связи.

CAN_SynJumpWidth-предел рассинхронизации( не соответствие сигналов) который не вызовет ошибки, измеряется в квантах( quanta), определяется как CAN_SynJumpWidth_TypeDef, варианты:
 CAN_SynJumpWidth_1TimeQuantum;
 CAN_SynJumpWidth_2TimeQuantum;
 CAN_SynJumpWidth_3TimeQuantum;
 CAN_SynJumpWidth_4TimeQuantum.
CAN_BitSeg1-первая часть бита, после отсчета которой производится захват или определение значение принимаемого бита данных, определяется как CAN_BitSeg1_TypeDef, варианты:
 CAN_BitSeg1_1TimeQuantum;
 CAN_BitSeg1_2TimeQuantum;
 CAN_BitSeg1_3TimeQuantum;
 CAN_BitSeg1_4TimeQuantum;
 CAN_BitSeg1_5TimeQuantum;
 CAN_BitSeg1_6TimeQuantum;
 CAN_BitSeg1_7TimeQuantum;
 CAN_BitSeg1_8TimeQuantum;
 CAN_BitSeg1_9TimeQuantum;
 CAN_BitSeg1_10TimeQuantum;
 CAN_BitSeg1_11TimeQuantum;
 CAN_BitSeg1_12TimeQuantum;
 CAN_BitSeg1_13TimeQuantum;
 CAN_BitSeg1_14TimeQuantum;
 CAN_BitSeg1_15TimeQuantum;
 CAN_BitSeg1_16TimeQuantum.
CAN_BitSeg2-вторая часть бита, после отсчета которой должен быть новый бит или проверочный код если данные закончились, определяется как CAN_BitSeg2_TypeDef, варианты:
 CAN_BitSeg2_1TimeQuantum;
 CAN_BitSeg2_2TimeQuantum;
 CAN_BitSeg2_3TimeQuantum;
 CAN_BitSeg2_4TimeQuantum;
 CAN_BitSeg2_5TimeQuantum;
 CAN_BitSeg2_6TimeQuantum;
 CAN_BitSeg2_7TimeQuantum;
 CAN_BitSeg2_8TimeQuantum.
CAN_Prescaler-параметр определяющий время кванта и соответственно скорость передачи данных, значение может быть в пределах от 0 до 63.


 Для сопряжения двух и более устройств вам понадобится их настроить на работу с одной скоростью передачи данных, для этого надо с начало вычислить сколько продолжительность кванта( tq) по времени, делается это по формуле
tq = ( CAN_Prescaler+ 1)/f MASTER, где f MASTER частота с которой тактируется модуль CAN или системная.
 Теперь смотрим из чего состоит бит информации, рисунок ниже.

нет рисунка

 SYNC_SEG-поле синхронизации, продолжительность равняется одному кванту( tq).
 CAN_BitSeg1-продолжительность равна tBS1, tBS1 находится значение CAN_BitSeg1 умноженное на квант( tq), например CAN_BitSeg1_8TimeQuantum где значение цифра внутри то есть 8.
 CAN_BitSeg2-продолжительность равна tBS2, tBS2 находится значение CAN_BitSeg2 умноженное на квант( tq), например CAN_BitSeg2_6TimeQuantum где значение цифра внутри то есть 6.

 
CAN_FilterInit( CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, CAN_FilterScale, CAN_FilterID1, CAN_FilterID2, CAN_FilterID3, CAN_FilterID4, CAN_FilterIDMask1, CAN_FilterIDMask2, CAN_FilterIDMask3, CAN_FilterIDMask4)-функция применяет настройки для банков фильтров, на вход получает параметры, описание которых ниже.
CAN_FilterNumber-номер банка к которому будут применены настройки, определяется как CAN_FilterNumber_TypeDef, возможно шесть вариантов:
 CAN_FilterNumber_0;
 CAN_FilterNumber_1;
 CAN_FilterNumber_2;
 CAN_FilterNumber_3;
 CAN_FilterNumber_4;
 CAN_FilterNumber_5.
CAN_FilterActivation-ENABLE включает банк( фильтр), DISABLE отключает, определяется как FunctionalState.
CAN_FilterScale-параметр определяет масштабирование( разрядность) идентификаторов и масок записанных в шестьдесят четырех битный регистр фильтра, определяется как CAN_FilterScale_TypeDef, возможные варианты:
 CAN_FilterScale_8Bit-все идентификаторы и маски по восемь бит, при масштабирование восемь бит у стандартных идентификаторов( 11 бит) работают только старшие восемь бит младшие три срезаются, в одном банке может быть восемь идентификатора или четыре идентификатор+маска;
 CAN_FilterScale_16_8Bit-в первых( старших) тридцати двух битах банка можно записать два шестнадцати битных идентификатора или один шестнадцати битный идентификатор+маска и в остальных тридцати двух битах( масштабирование восемь бит) будут хранится четыре идентификатора или два идентификатора+маска все по восемь бит разрядности, при масштабирование восемь бит у стандартных идентификаторов( 11 бит) работают только старшие восемь бит младшие три срезаются.
 CAN_FilterScale_16Bit-все идентификаторы и маски по шестнадцать бит, в одном банке может быть четыре идентификатора или два идентификатор+маска;
 CAN_FilterScale_32Bit-идентификаторы и маски по тридцать два бита, в одном банке может быть два идентификатора или один идентификатор+маска;

CAN_FilterMode-режим работы фильтра, определяется как CAN_FilterMode_TypeDef, возможны варианты:
 CAN_FilterMode_IdMask-для отфильтровывания нужных сообщений используется идентификатор+маска;
 CAN_FilterMode_IdMask_IdList-половина фильтров в банке будет использоваться как идентификатор+маска остальные будут идентификаторами, если используется CAN_FilterScale_16_8Bit то в старших тридцати двух битах будет идентификатор+маска разрядностью шестнадцать бит в остальных тридцати двух битах идентификаторы по восемь бит;
 CAN_FilterMode_IdList_IdMask-половина фильтров в банке будет использоваться как идентификатор остальные будут идентификаторами+маска, если используется CAN_FilterScale_16_8Bit то в старших тридцати двух битах будет идентификаторы разрядностью шестнадцать бит в остальных тридцати двух битах идентификаторы+маска по восемь бит;
 CAN_FilterMode_IdList-для отфильтровывания нужных сообщений используется только идентификаторы.


 Рекомендация, банки фильтров в масштабировании CAN_FilterScale_8Bit или CAN_FilterScale_16_8Bit лучше не использовать так как в восьми битном масштабировании значение в фильтре будет сравниваться со старшими восьмыми битами принятого идентификатора то есть младшие его три бита учитываться не будут, если стандартный идентификатор.
 Для стандартных идентификаторов( одиннадцать бит) используйте масштабирование CAN_FilterScale_16Bit или расширенных( двадцать девять бит) CAN_FilterScale_32Bit.


 Примеры настройки фильтров.

//Настраиваем банк 0, масштаб 16, идентификатор+маска.
uint8_t CAN_FilterID1= 0;
uint8_t CAN_FilterID2= 0;
uint8_t CAN_FilterID3= 0;
uint8_t CAN_FilterID4= 0;
uint8_t CAN_FilterIDMask1= 0;
uint8_t CAN_FilterIDMask2= 0;
uint8_t CAN_FilterIDMask3= 0;
uint8_t CAN_FilterIDMask4= 0;
//Все идентификаторы до 3.
uint16_t ID_test1= 0;
uint16_t MASK_test1= 2044;//BIN 11111111100
//Идентификатор со значение 4.
uint16_t ID_test2= 4;
uint16_t MASK_test2= 2047;
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_16Bit;
CAN_FilterID1= (uint8_t )( ID_test1>>3);
CAN_FilterID2= (uint8_t )( ID_test1<<5);
CAN_FilterIDMask1= (uint8_t )( MASK_test1>>3);
CAN_FilterIDMask2= (uint8_t )( MASK_test1<<5);
CAN_FilterID3= (uint8_t )( ID_test2>>3);
CAN_FilterID4= (uint8_t )( ID_test2<<5);
CAN_FilterIDMask3= (uint8_t )( MASK_test2>>3);
CAN_FilterIDMask4= (uint8_t )( MASK_test2<<5);
CAN_FilterInit( CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, CAN_FilterScale, CAN_FilterID1, CAN_FilterID2, CAN_FilterID3, CAN_FilterID4, CAN_FilterIDMask1, CAN_FilterIDMask2, CAN_FilterIDMask3, CAN_FilterIDMask4);
//Настраиваем банк 0, масштаб 16, четыре фильтра как идентификатор.
uint8_t CAN_FilterID1= 0;
uint8_t CAN_FilterID2= 0;
uint8_t CAN_FilterID3= 0;
uint8_t CAN_FilterID4= 0;
uint8_t CAN_FilterIDMask1= 0;
uint8_t CAN_FilterIDMask2= 0;
uint8_t CAN_FilterIDMask3= 0;
uint8_t CAN_FilterIDMask4= 0;
//Идентификаторы 1, 2, 3, 4.
uint16_t ID_test1= 1;
uint16_t ID_test2= 2;
uint16_t ID_test3= 3;
uint16_t ID_test4= 4;
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterScale = CAN_FilterScale_16Bit;
CAN_FilterID1= (uint8_t )( ID_test1>>3);
CAN_FilterID2= (uint8_t )( ID_test1<<5);
CAN_FilterIDMask1= (uint8_t )( ID_test2>>3);
CAN_FilterIDMask2= (uint8_t )( ID_test2<<5);
CAN_FilterID3= (uint8_t )( ID_test3>>3);
CAN_FilterID4= (uint8_t )( ID_test3<<5);
CAN_FilterIDMask3= (uint8_t )( ID_test4>>3);
CAN_FilterIDMask4= (uint8_t )( ID_test4<<5);
CAN_FilterInit( CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, CAN_FilterScale, CAN_FilterID1, CAN_FilterID2, CAN_FilterID3, CAN_FilterID4, CAN_FilterIDMask1, CAN_FilterIDMask2, CAN_FilterIDMask3, CAN_FilterIDMask4);
//Настраиваем банк 0, масштаб 32, для стандартного идентификатора, идентификатор+маска.
uint8_t CAN_FilterID1= 0;
uint8_t CAN_FilterID2= 0;
uint8_t CAN_FilterID3= 0;
uint8_t CAN_FilterID4= 0;
uint8_t CAN_FilterIDMask1= 0;
uint8_t CAN_FilterIDMask2= 0;
uint8_t CAN_FilterIDMask3= 0;
uint8_t CAN_FilterIDMask4= 0;
//Все идентификаторы до 3.
uint16_t ID_test1= 0;
uint16_t MASK_test1= 2044;//BIN 11111111100
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_32Bit;
CAN_FilterID1= (uint8_t )( ID_test1>>3);
CAN_FilterID2= (uint8_t )( ID_test1<<5);
CAN_FilterIDMask1= (uint8_t )( MASK_test1>>3);
CAN_FilterIDMask2= (uint8_t )( MASK_test1<<5);
CAN_FilterInit( CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, CAN_FilterScale, CAN_FilterID1, CAN_FilterID2, CAN_FilterID3, CAN_FilterID4, CAN_FilterIDMask1, CAN_FilterIDMask2, CAN_FilterIDMask3, CAN_FilterIDMask4);
//Настраиваем банк 0, масштаб 32, для стандартного идентификатора, два фильтра как идентификатор.
uint8_t CAN_FilterID1= 0;
uint8_t CAN_FilterID2= 0;
uint8_t CAN_FilterID3= 0;
uint8_t CAN_FilterID4= 0;
uint8_t CAN_FilterIDMask1= 0;
uint8_t CAN_FilterIDMask2= 0;
uint8_t CAN_FilterIDMask3= 0;
uint8_t CAN_FilterIDMask4= 0;
//Идентификаторы 1, 2.
uint16_t ID_test1= 1;
uint16_t ID_test2= 2;
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterScale = CAN_FilterScale_32Bit;
CAN_FilterID1= (uint8_t )( ID_test1>>3);
CAN_FilterID2= (uint8_t )( ID_test1<<5);
CAN_FilterIDMask1= (uint8_t )( ID_test2>>3);
CAN_FilterIDMask2= (uint8_t )( ID_test2<<5);
CAN_FilterInit( CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, CAN_FilterScale, CAN_FilterID1, CAN_FilterID2, CAN_FilterID3, CAN_FilterID4, CAN_FilterIDMask1, CAN_FilterIDMask2, CAN_FilterIDMask3, CAN_FilterIDMask4);


CAN_TxStatus_TypeDef CAN_Transmit( CAN_Id, CAN_IDE, CAN_RTR, CAN_DLC, *CAN_Data)-функция для отправки сообщений( данных), возвращает CAN_TxStatus_TypeDef статус состояния который может быть следующим:
 CAN_TxStatus_NoMailBox-нет свободных почтовых ящиков, нужно ждать освобождения одного из трёх только потом отправлять;
 CAN_TxStatus_MailBox0Ok-сообщение отправляется из первого почтового ящика;
 CAN_TxStatus_MailBox1Ok-сообщение отправляется из второго почтового ящика;
 CAN_TxStatus_MailBox2Ok-сообщение отправляется из третьего почтового ящика;
Функция принимает следующие параметры:
CAN_Id-тридцать два бита идентификатор.
CAN_IDE-устанавливает длину отправляемого идентификатора, если параметр CAN_Id_Standard то 11 бит или CAN_Id_Extended то расширенный 29 бит, определяется как CAN_Id_TypeDef.
CAN_RTR-если параметр CAN_RTR_Data то отправляется сообщение с данными, если CAN_RTR_Remote то сообщение перегрузки( ожидания), определяется как CAN_RTR_TypeDef.
CAN_DLC-количество отправляемых данных от 1 до 8.
*CAN_Data-массив uint8_t отправляемых данных размером восемь байт.


CAN_Receive( )-функция вынимает принятые данные из почтового ящика и заполняет ими специальную структуру которая была создана автоматически, из этой структуры можете вынуть данные с помощью следующих функций:
uint32_t CAN_GetReceivedId( )-возвращает значение идентификатора, тридцать два бита;
CAN_Id_TypeDef CAN_GetReceivedIDE( )-определяет какой идентификатор принят, CAN_Id_Standard стандартный или CAN_Id_Extended расширенный;
CAN_RTR_TypeDef CAN_GetReceivedRTR( )-определяет какое сообщение принято, CAN_RTR_Data данные или CAN_RTR_Remote перегрузки;
uint8_t CAN_GetReceivedDLC( )-функция вернёт количество принятых данных;
uint8_t CAN_GetReceivedData( CAN_DataIndex)-функция вынимает из массива принятые данные, CAN_DataIndex индекс в массиве от 0 до 7;
uint8_t CAN_GetReceivedFMI( )-возвращает номер фильтра разрешившего принять сообщение;


CAN_TxStatus_TypeDef CAN_TransmitStatus( CAN_TransmitMailbox)-функция используется для проверки состояния отправляемого почтового ящика, принимает номер почтового ящика CAN_TransmitMailBox_0, CAN_TransmitMailBox_1 или CAN_TransmitMailBox_2.
 Возвращает состояние:
 CAN_TxStatus_Failed-ошибка отправки сообщения;
 CAN_TxStatus_Ok-сообщение отправлено;
 CAN_TxStatus_Pending-почтовый ящик в ожидании отправки;
 CAN_TxStatus_MailBoxEmpty-почтовый ящик пуст.


CAN_ITConfig( CAN_IT, NewState)-функция включает если NewState ENABLE или выключает DISABLE нужное прерывание, которые перечислены ниже:
 CAN_IT_TME-один из трех почтовых ящиков отправил сообщение;
 CAN_IT_FMP-принято новое сообщение;
 CAN_IT_FF-приёмный буфер FIFO полон;
 CAN_IT_FOV-приёмный буфер FIFO полон и начал перезаписываться;
 CAN_IT_WKU-прерывание от выхода модуля CAN из сна;
 CAN_IT_ERR-общее прерывание для ошибок;
 CAN_IT_EWG-прерывание если счетчик ошибок отправки данных превысит 96;
 CAN_IT_EPV-прерывание если счетчик пассивных ошибок превысит 127;
 CAN_IT_BOF-прерывание от отключения шины CAN;
 CAN_IT_LEC-прерывание от активной ошибки, выявляется при передачи или приеме данных.

Статья №42 Дата:10/04/2019

Комментарии.