PROGCONT.RU

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

STM32F CAN расчёт скорости обмена информацией и описание функций SPL( стандартной периферийной библиотеки).


 Для тех кто не знает что такое CAN и как он работает заходим сюда  "Описание интерфейса CAN и обмена информацией по его шине.", и внимательно изучаем теорию.
 Прежде чем изучать стандартную библиотеку функций давайте разберемся что такое time quanta, из чего состоит бит информации и как вычислить скорость передачи данных, ниже рисунок где изображено как это все выглядит, что я попытаюсь понятно объяснить.нет рисунка


 Time quanta( квант времени) или tq в рисунке самая маленькая единица от которой все зависит, вычисляется по формуле нет рисункагде BRP[9:0] значение предделителя от 0 до 1023 в регистре CAN_BTR, tpclk продолжительность одного периода такта тактирования предделителя от шины APB1.
 Пример вычисления где частота APB1 36MHz и значение преддилителя равно 1000.
tq=(1000+1)/36000000=0.00002781 секунды.
 Теперь из чего состоит бит информации, он состоит из трех полей:
SYNG_SEG поле синхронизации, продолжительностью один tq( квант);
BIT SEGMENT 1 первая часть бита после отсчёта которой происходит определение( захват) единица или ноль информации на линии, зависит от TS1[3:0] в регистре CAN_BTR, вычисляется;нет рисунка
BIT SEGMENT 2 вторая часть бита, после отсчета которой должен быть новый бит или CRC Field если данные закончились, зависит от TS2[2:0] в регистре CAN_BTR, вычисляется.нет рисунка
 После уяснения из чего состоит бит информации мы можем вычислить скорость передачи информации, в итоге скорость передачи данных будет 1/( SYNG_SEG+ BIT SEGMENT 1+ BIT SEGMENT 2) и получаем бит в секунду.
 Пример вычисления где tq( квант) равен 0.00002781, TS1 максимальное значение 15 и TS2 тоже максимальное значение 7.
1/( 0.00002781+( 15+1)*0.00002781+( 7+1)*0.00002781)=1438 бит в секунду.


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

CAN_DeInit( CANx)-функция сбрасывает все настройки CANx( CAN1 или CAN2) и отключает его прерывания.

CAN_StructInit( CAN_InitStruct)-функция принимает структуру у которой все параметры установит в состояние по умолчанию.

uint8_t CAN_Init( CANx, CAN_InitStruct)-функция основной настройки CAN, возвращает флаг( 1 успешная или 0 не сработала) результата инициализации, на вход получает название CANx( CAN1 или CAN2) для которого будет применена структура CAN_InitStruct объявление и описание которой смотрите ниже.
CAN_InitTypeDef-объявление структуры CAN_InitStruct имя которой произвольно, элементы структуры:
1) CAN_Prescaler-предделитель тактирования CAN модуля, возможно значение от 1 до 1024.
2) CAN_Mode-режим работы модуля:
 CAN_Mode_Normal-отправляются, принимаются данные и выполняется контроль ошибок, обычный режим работы;
 CAN_Mode_LoopBack-режим предназначен для самотестирования отправляет и сам принимает свои данные, вывод TX подсоединен внутри контроллера к RX поэтому отсутствует контроль ошибок, RX не подключен к шине CAN. Так как вывод TX подключен к шине другие устройства могут контролировать передачи;
 CAN_Mode_Silent-в этом режиме устройство выступает в качестве слушателя линии CAN, подключен к шине только вывод RX, устройство влиять на обнаружение ошибок не может из за не подключенного TX;
 CAN_Mode_Silent_LoopBack-устройство полностью отключено от шины CAN, используется для самотестирования без влияния на линию связи.

нет рисунка

3) CAN_SJW-параметр устанавливает компенсацию искажения скорости передачи данных, если скорость передачи изменилась например из за помех и отличается от запланированной в сети то возникновение синхроимпульса в незапланированное время но в пределах этого параметра не вызовет ошибку, варианты:
 CAN_SJW_1tq-меньше 1 кванта;
 CAN_SJW_2tq-меньше 2 кванта;
 CAN_SJW_3tq-меньше 3 кванта;
 CAN_SJW_4tq-меньше 4 кванта;
4) CAN_BS1-первая часть бита, значение с CAN_BS1_1tq до CAN_BS1_16tq.
5) CAN_BS2-вторая часть бита, значение с CAN_BS2_1tq до CAN_BS2_8tq.
6) CAN_TTCM-если параметр ENABLE то включен триггер захвата времени, после включения CAN у него активируется свой внутренний шестнадцатибитный таймер который увеличивается после отсчета времени равное биту данных, если обнаруживается бит SOF то происходит захват счетчика таймера и результат помещается в регистр CAN_RDTxR( принимает данные) или CAN_TDTxR( отправляет данные), результата можно прочесть или отправить автоматически с сообщением. DISABLE отключает данную функцию.
7) CAN_ABOM-ENABLE включает автоматическое отключение устройства от шины после переполнения счетчика ошибок, DISABLE отключение будет возможно программным путем и устройство будет постоянно отправлять или принимать данные не смотря на переполнения счетчика ошибок.
8) CAN_AWUM-ENABLE выход из режима сна будет автоматически после обнаружения активности на шине, DISABLE выход из сна только программным методом.
9) CAN_NART-DISABLE включает повторную отправку данных если они были не доставлены, например из за ошибок, ENABLE данные будут отправлены один раз не зависимо от получения адресатом.
10) CAN_RFLM-DISABLE отключает блокировку от перезаписи приемного буфера FIFO то есть если не успели вынуть принятые данные то новыми будет перезаписан буфер, ENABLE блокировка включена, перезаписи не будет.
11) CAN_TXFP-устанавливает порядок отправки сообщений если их несколько из буфера FIFO отправки, DISABLE отправлены будут сообщения с наивысшим приоритетом то есть с меньшим значением индификатора, ENABLE сообщения из буфера будут уходить по порядку.


CAN_FilterInit( CAN_FilterInitStruct)-функция настройки фильтра входящих сообщений, для отсева не нужных сообщений или приема нужных. Функция принимает структуру CAN_FilterInitStruct объявление и описание которой смотрите ниже.
CAN_FilterInitTypeDef-объявление структуры для фильтрации сообщений, описание элементов которой ниже:
1) CAN_FilterIdHigh-старшие шестнадцать бит идентификатора;
2) CAN_FilterIdLow-младшие шестнадцать бит идентификатора;
3) CAN_FilterMaskIdHigh-старшие шестнадцать бит маски идентификатора;
4) CAN_FilterMaskIdLow-младшие шестнадцать бит маски;
5) CAN_FilterFIFOAssignment-прикрепляем буфер FIFO для данного фильтра куда будут сохранятся принятые данные. Выбрать можно один из двух CAN_FIFO0 или CAN_FIFO1.
6) CAN_FilterNumber-выбор фильтра, значение от 0 до 13.
нет рисунка 7) CAN_FilterMode-режим работы фильтра, два варианта:
 CAN_FilterMode_IdMask-выбор нужного сообщения выполняется через накладывания маски на его идентификатор и сравнение полученного результата с идентификатором фильтра, если они совпали то сообщение сохраняется в буфере FIFO.
CAN_FilterMode_IdList-в фильтре прописываются только нужные идентификаторы сообщений которые нужно принять, сообщение сохранится в буфере FIFO если будет точное совпадения идентификатора сообщения и фильтра.
8) CAN_FilterScale-выбор размера фильтра:
 CAN_FilterScale_16bit-длина фильтра 16 бит, применим для фильтрации стандартных сообщений у которых идентификатор 11 бит, бит IDE и RTR.
 CAN_FilterScale_32bit-длина фильтра 32 бита, используется для фильтрации как стандартных так и расширенных идентификаторов сообщений.
9) CAN_FilterActivation-ENABLE подключает данный фильтр для выбора нужных сообщений, DISABLE отключает.


CAN_SlaveStartBank( CAN_BankNumber)-функция устанавливает с какого банка начинаются фильтра для CAN2, варианты с 1 до 27, по умолчанию установлен 14 то есть с 14 по 27 будут под CAN2 и с 0 по 13 для CAN1.

CAN_DBGFreeze( CANx, NewState)-функция принимает название CANx( CAN1 или CAN2) модуля и его состояние:
ENABLE-включает заморозку( не может отправлять или принимать данные) модуля CAN во время режима отладки контроллера;
DISABLE-модуль CAN продолжает принимать и отправлять данные во время отладки контроллера.

CAN_TTComModeCmd( CANx, NewState)-функция включает если NewState будет ENABLE триггер захвата времени, DISABLE отключает, CANx это CAN1 или CAN2.

uint8_t CAN_Transmit( CANx, TxMessage)-функция отправки данных возвращает номер mailbox( один из трех почтовых ящиков отправляемых сообщений) которым отправляется сообщение возможны варианты от 0 до 2, на вход принимает название CANx и структуру сообщения описание которой ниже.
CanTxMsg-объявление структуры для отправки данных TxMessage, имя которой произвольно, элементы структуры:
1) StdId-идентификатор стандартного сообщения;
2) ExtId-расширенный идентификатор сообщения, если используется стандартные сообщения то он должен быть равен нулю;
3) IDE-индикатор указывающий какое сообщение отправлено:
 a) CAN_Id_Standard-стандартное;
 b) CAN_Id_Extended-расширенное.
4) RTR-индикатор указывающий что сообщение данных или перегрузки:
 a) CAN_RTR_Data-сообщение данных;
 b) CAN_RTR_Remote-сообщение перегрузки.
5) DLC-количество отправляемых данных, от 0 до 8.
6) Data[8]-массив отправляемых данных.

uint8_t CAN_TransmitStatus( CANx, TransmitMailbox)-функция принимает название CANx, номер почтового ящика каким отправляем сообщение и назад функция возвращает состояние сообщения:
 CAN_TxStatus_Failed-ошибка отправки данных;
 CAN_TxStatus_Ok-сообщение отправлено;
 CAN_TxStatus_Pending-сообщение отравляется или ждет отправки;
 CAN_TxStatus_NoMailBox-для отправки сообщения не нашлось пустого почтового ящика.

CAN_CancelTransmit( CANx, Mailbox)-функция отменяет отправку данных если почтовый ящик ждет своей очереди, на вход принимает название CANx и номер почтового ящика.

CAN_Receive( CANx, FIFONumber, RxMessage)-функция заполняет структуру RxMessage принятыми данными, перед её выполнением нужно убедится что данные пришли. На вход принимает название CANx, номер принимающего буфера FIFONumber который может быть CAN_FIFO0 или CAN_FIFO1 и структуру для данных RxMessage.
CanRxMsg-объявление структуры для принятых данных, элементы структуры:
1) StdId-стандартный идентификатор принятого сообщения;
2) ExtId-расширенный идентификатор принятого сообщения;
3) IDE-индикатор указывающий какое сообщение пришло:
 a) CAN_Id_Standard-стандартное;
 b) CAN_Id_Extended-расширенное.
4) RTR-индикатор указывающий что пришло сообщение данных или перегрузки:
 a) CAN_RTR_Data-сообщение данных;
 b) CAN_RTR_Remote-сообщение перегрузки.
5) DLC-количество принятых данных, от 0 до 8.
6) Data[8]-массив с принятыми данными;
7) FMI-тут будет хранится индекс фильтра через который было принято сообщение.

CAN_FIFORelease( CANx, FIFONumber)-функция освобождает буфер FIFONumber( CAN_FIFO0 или CAN_FIFO1) в модуле CANx( CAN1 или CAN2) от принятых данных после их прочтения или если в буфере есть не прочитанные данные но нужно срочно принять другие.

CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber)-функция возвращает количество сообщений в модуле CANx( CAN1 или CAN2) хранящихся в буфере FIFONumber( CAN_FIFO0 или CAN_FIFO1) и ожидающих прочтения, после выполнения функции CAN_FIFORelease возвращаемое значение будет уменьшатся.

uint8_t CAN_OperatingModeRequest( CANx, CAN_OperatingMode)-функция позволяет модулю CANx( CAN1 или CAN2) войти в режим CAN_OperatingMode варианты:
CAN_OperatingMode_Initialization-режим инициализации;
CAN_OperatingMode_Normal-рабочий режим, модуль готов принимать и отправлять данные;
CAN_OperatingMode_Sleep-режим ожидания.
 Если назад функция вернуло CAN_ModeStatus_Success то удалось войти в выбранный режим, если вернуло CAN_ModeStatus_Failed значит произошла ошибка.


uint8_t CAN_Sleep( CANx)-функция вводит модуль CANx( CAN1 или CAN2) в режим сна, возвращает результат CAN_Sleep_Ok удачно или CAN_Sleep_Failed не получилось.

uint8_t CAN_WakeUp( CANx)-функция выводит CANx из сна, возвращает CAN_WakeUp_Ok удачно или CAN_WakeUp_Failed не получилось.

uint8_t CAN_GetLastErrorCode( CANx)-функция возвращает последнюю ошибку возникшую в модуле CANx, варианты:
CAN_ErrorCode_NoErr-ошибки не было;
CAN_ErrorCode_StuffErr-ошибка заполнения появляется, когда узел обнаруживает шесть последовательных битов одного и того же значения. В процессе нормальной работы, когда передатчик обнаруживает, что он послал пять последовательных битов одного и того же значения, он заполняет следующий бит противоположным значением (это называется заполнением бита). Все приемники удаляют заполненные биты до вычисления CRC (контрольного кода). Таким образом, когда узел обнаруживает шесть последовательных битов того же значения, возникает ошибка заполнения.
CAN_ErrorCode_FormErr-ошибка формы возникает, когда недопустимое разрядное значение обнаружено в области, в которую должно быть передано предопределенное значение. В CAN протоколе существуют некоторые предопределенные разрядные значения, которые должны быть переданы в определенных местах. Если недопустимое разрядное значение обнаружено в одной из этих областей, имеет место ошибка формы.
CAN_ErrorCode_ACKErr-каждое устройство получив своё сообщение должно подтвердить выставив на линии доминантный бит. Если же этого не происходит, то передающий узел регистрирует ошибку.
CAN_ErrorCode_BitRecessiveErr-устройство передающее сообщение контролирует отправку своих битов данных, если оно обнаруживает что на линии не рецессивный бит когда должен быть он то возникнет данная ошибка.
CAN_ErrorCode_BitDominantErr-то же самое что и ошибка выше только возникает при отсутствии на линии доминирующего бита когда он должен быть.
CAN_ErrorCode_CRCErr-CRC ошибка появляется когда CRC значение(контрольный код) вычисленное приемником не соответствует значению с генерированному передатчиком.
CAN_ErrorCode_SoftwareSetErr-ошибка возникнет если вы выполните функцию CANx->ESR|=CAN_ErrorCode_SoftwareSetErr;, CANx может быть CAN1 илиCAN2. Данное действие может генерировать ваше собственное прерывание от ошибок.


uint8_t CAN_GetReceiveErrorCounter( CANx)-функция возвращает количество ошибок модуля CANx зафиксированных при приеме данных, если счетчик ошибок будет больше 127 то CAN уйдет в пассивное состояние.

uint8_t CAN_GetLSBTransmitErrorCounter( CANx)-функция похожа на предыдущую только возвращает количество ошибок зафиксированных при передаче данных.


CAN_ITConfig( CANx, CAN_IT, NewState)-функция включает прерывание от определенного события в модуле CAN, принимает название CANx, CAN_IT нужное прерывание и состояние ENABLE включить, DISABLE отключить.
Название прерываний CAN_IT:
1) CAN_IT_TME-прерывание произойдет после окончания отправки из любого почтового ящика( mailbox);
2) CAN_IT_FMP0-прерывание от полученного сообщение которое ожидает в буфере FIFO0;
3) CAN_IT_FF0-прерывание произойдет если буфер FIFO0 будет полон;
4) CAN_IT_FOV0-прерывание произойдет если буфер FIFO0 будет полон но придут новые и буфер будет переписан;
5) CAN_IT_FMP0-прерывание от полученного сообщение которое ожидает в буфере FIFO1;
6) CAN_IT_FF0-прерывание произойдет если буфер FIFO1 будет полон;
7) CAN_IT_FOV0-прерывание произойдет если буфер FIFO1 будет полон но придут новые и буфер будет переписан;
8) CAN_IT_WKU-прерывание произойдет если CAN выйдет из режима сна, если в нём находился;
9) CAN_IT_SLK-если CAN уйдет в режим сна то будет с регенерировано это прерывание;
10) CAN_IT_EWG-прерывание от переполнения счетчика ошибки отправки данных если он больше 95;
11) CAN_IT_EPV-прерывание от переполнения счетчика ошибки в пассивном состоянии или принятии данных, если счётчик будет больше 127;
12) CAN_IT_BOF-прерывание от отключения шины CAN;
13) CAN_IT_LEC-прерывание от активной ошибки, выявляется при передачи или приеме данных, проверяется функцией CAN_GetLastErrorCode( CANx);
14) CAN_IT_ERR-общее прерывание для ошибок, которые можно выявить проверкой флагов: CAN_FLAG_LEC, CAN_FLAG_BOF, CAN_FLAG_EPV, CAN_FLAG_EWG;


FlagStatus CAN_GetFlagStatus( CANx, CAN_FLAG)-функция проверяет состояние флага прерывание, принимает название CANx, CAN_FLAG проверяемый флаг, возвращает SET если флаг установлен и RESET нет.
Флаги прерываний CAN_FLAG варианты:
1) CAN_FLAG_RQCP0-устанавливается когда будет отправлено сообщение из почтового ящика( mailbox) с номером ноль;
2) CAN_FLAG_RQCP1-устанавливается когда будет отправлено сообщение из почтового ящика( mailbox) с номером один;
3) CAN_FLAG_RQCP2-устанавливается когда будет отправлено сообщение из почтового ящика( mailbox) с номером два;
4) CAN_FLAG_FMP0-в буфере FIFO0 ожидает принятое сообщение;
5) CAN_FLAG_FF0-буфер FIFO0 полон;
6) CAN_FLAG_FOV0-буфер FIFO0 начал перезаписываться новыми данными;
7) CAN_FLAG_FMP1-в буфере FIFO1 ожидает принятое сообщение;
8) CAN_FLAG_FF1-буфер FIFO1 полон;
9) CAN_FLAG_FOV1-буфер FIFO1 начал перезаписываться новыми данными;
10) CAN_FLAG_WKU-флаг устанавливается если CANx модуль вышел из сна;
11) CAN_FLAG_SLAK-флаг устанавливается при уходе CANx в сон;
12) CAN_FLAG_EWG-флаг ошибки от переполнения счетчика фиксирующего не корректные отправки данных;
13) CAN_FLAG_EPV-флаг ошибки от переполнения счетчика фиксирующего пассивные ошибки;
14) CAN_FLAG_BOF-флаг выключения шины, отсутствует необходимое напряжение в проводах;
15) CAN_FLAG_LEC-флаг активной ошибки, устанавливается при попытке отправки или приеме данных.

 
CAN_ClearFlag( CANx, CAN_FLAG)-функция сбрасывает флаг прерываний модуля CANx, CAN_FLAG названия флагов перечисленных в функции выше.

ITStatus CAN_GetITStatus( CANx, CAN_IT)-функция возвращает состояние прерывания, SET прерывание произошло и RESET не было, принимает CANx модуль и название прерывания которые уже были описаны в функции CAN_ITConfig( CANx, CAN_IT, NewState). Функция похожа на FlagStatus CAN_GetFlagStatus( CANx, CAN_FLAG) только принимает названия прерываний а не флагов.

CAN_ClearITPendingBit( CANx, CAN_IT)-функция принимает название модуля CANx и название прерывания описанные в функции CAN_ITConfig( CANx, CAN_IT, NewState), очищает биты ожидания, например если в буфере FIFO0 имеются данные для чтения то после выполнения этой функции с определенным битом ожидания модуль будет считать что сообщение было прочтено и можно принимать другое.

Статья №40 Дата:16/03/2019

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