|
測試FDCAN_MODE_EXTERNAL_LOOPBACK, 邏輯分析接tx確定有發出去
但沒有發生接收
去接收函式查, 發現錯誤在HAL_FDCAN_ERROR_FIFO_EMPTY, 表示沒資料進去rx緩衝區嘛?
HAL_StatusTypeDef HAL_FDCAN_GetRxMessage(FDCAN_HandleTypeDef *hfdcan, uint32_t RxLocation, FDCAN_RxHeaderTypeDef *pRxHeader, uint8_t *pRxData)
{
/* Check that the Rx FIFO 0 is not empty */
if ((hfdcan->Instance->RXF0S & FDCAN_RXF0S_F0FL) == 0U)
{
/* Update error code */
hfdcan->ErrorCode |= HAL_FDCAN_ERROR_FIFO_EMPTY;
return HAL_ERROR;
}
}
初始及濾波器相關設定
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
hfdcan1.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK;//FDCAN_MODE_NORMAL;FDCAN_MODE_EXTERNAL_LOOPBACK
hfdcan1.Init.AutoRetransmission = DISABLE;
hfdcan1.Init.TransmitPause = DISABLE;
hfdcan1.Init.ProtocolException = DISABLE;
//baud rate pclk1(apb11)/Prescale/(1+TimeSeg1+TimeSeg2)= 170M/17/(1+14+5)=0.5Mbit/s
//(1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)= (1+14)/(1+14+5) =75%
//baud rate pclk1(apb11)/Prescale/(1+TimeSeg1+TimeSeg2)= 170M/17/(1+7+2)=1.0Mbit/s
//(1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)= (1+7)/(1+7+2) =80%
//baud rate pclk1(apb11)/Prescale/(1+TimeSeg1+TimeSeg2)= 170M/17/(1+34+15)=0.2Mbit/s
//(1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)= (1+34)/(1+34+15) =70%
hfdcan1.Init.NominalPrescaler = 17;
hfdcan1.Init.NominalSyncJumpWidth = 15;
hfdcan1.Init.NominalTimeSeg1 = 34;
hfdcan1.Init.NominalTimeSeg2 = 15;
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 1;
hfdcan1.Init.DataTimeSeg1 = 1;
hfdcan1.Init.DataTimeSeg2 = 1;
hfdcan1.Init.StdFiltersNbr = 2;
hfdcan1.Init.ExtFiltersNbr = 2;
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) {
Error_Handler();
}
hfdcan1_RX_Filter.IdType = FDCAN_STANDARD_ID;// FDCAN_EXTENDED_ID
hfdcan1_RX_Filter.FilterIndex = 0; /* 濾波器器索引 */
hfdcan1_RX_Filter.FilterType = FDCAN_FILTER_MASK;/* 濾波器類型 */
hfdcan1_RX_Filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;/* 濾波器連到RXFIFO0 */
hfdcan1_RX_Filter.FilterID1 = 0x001;
hfdcan1_RX_Filter.FilterID2 = 0x7FF;
if (HAL_FDCAN_ConfigFilter(&hfdcan1, &hfdcan1_RX_Filter) != HAL_OK) {
/* Filter configuration Error */
Error_Handler();
}
/* Configure global filter:
Filter all remote frames with STD and EXT ID
Reject non matching frames with STD ID and EXT ID */
if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK) {
Error_Handler();
}
if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
我任意做的tx封包及接收程式
hfdcan1_TxHeader.Identifier = 0x001;
hfdcan1_TxHeader.IdType = FDCAN_STANDARD_ID; //FDCAN_STANDARD_ID;//FDCAN_EXTENDED_ID;
hfdcan1_TxHeader.TxFrameType = FDCAN_DATA_FRAME; //FDCAN_REMOTE_FRAME:遙控幀, FDCAN_DATA_FRAME:數據幀
hfdcan1_TxHeader.DataLength = FDCAN_DLC_BYTES_8;
hfdcan1_TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
hfdcan1_TxHeader.BitRateSwitch = FDCAN_BRS_OFF; //FDCAN_BRS_ON;
hfdcan1_TxHeader.FDFormat = FDCAN_CLASSIC_CAN; //FDCAN_FD_CAN;
hfdcan1_TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;//FDCAN_NO_TX_EVENTS;//DCAN_STORE_TX_EVENTSㄥ
hfdcan1_TxHeader.MessageMarker = 0;
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &hfdcan1_TxHeader, tx_data) ;
FDCAN_RxHeaderTypeDef FDCAN_RxHeader;//用來保存接收數據資訊
if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &FDCAN_RxHeader, rx_buf) == HAL_OK) {
db_printf(DB_ALWAYS, "Identifier:%d\n",FDCAN_RxHeader.Identifier);
db_printf(DB_ALWAYS, "IdType:%d\n", FDCAN_RxHeader.IdType);
db_printf(DB_ALWAYS, "RxFrameType:%d\n",FDCAN_RxHeader.RxFrameType);
db_printf(DB_ALWAYS, "DataLength:%d\n",FDCAN_RxHeader.DataLength);
db_printf(DB_ALWAYS, "ErrorStateIndicato:%d\n",FDCAN_RxHeader.ErrorStateIndicator);
db_printf(DB_ALWAYS, "BitRateSwitch:%d\n",FDCAN_RxHeader.BitRateSwitch);
db_printf(DB_ALWAYS, "FDFormat:%d\n", FDCAN_RxHeader.FDFormat);
for (i = 0; i < 8; i++) {
db_printf(DB_ALWAYS, "%d\n", rx_buf);
}
}else
{
db_printf(DB_ALWAYS, "GetRxMessage no\n");
}
感謝
|
|