|
楼主 |
发表于 2024-5-15 11:43:05
|
显示全部楼层
感謝回覆
如圖, 我看邏輯分析的cam_L 看到拉低後拉高, 後續就沒變化
我加入发送空中断, 好像沒回到中斷, 可以麻煩幫我看一下程式, 程式如下
static void MX_FDCAN1_Init(void) {
/* USER CODE BEGIN FDCAN1_Init 0 */
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
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+10) =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 = 0x000;
hfdcan1_RX_Filter.FilterID2 = 0x7FF;
hfdcan1_RX_Filter.IdType = FDCAN_EXTENDED_ID;
hfdcan1_RX_Filter.FilterIndex = 1; /* 濾波器器索引 */
hfdcan1_RX_Filter.FilterType = FDCAN_FILTER_MASK;/* 濾波器類型 */
hfdcan1_RX_Filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;/* 濾波器連到RXFIFO0 */
hfdcan1_RX_Filter.FilterID1 = 0x00; //濾波器設置為全接收 //ex:0x20005參考kde get temperture
hfdcan1_RX_Filter.FilterID2 = 0x1FFFFFFF;
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();
}
// Create queues that act as buffer for tx and rx
fdcan1_txq = xQueueCreate(32,sizeof(fdcan_txq_element));
//fdcan1_rxq = xQueueCreate(256, sizeof(uint8_t)); //256? 再確認長度
fdcan1_rxq = xQueueCreate(32, sizeof(fdcan_rxq_element)); //四個單元 長度為sizeof(fdcan_rxq_element)=64
if ((fdcan1_rxq == NULL)|| (fdcan1_txq == NULL)){
Error_Handler();
}
// Create binary semaphore that is used to inform tasks if fdcan1 is ready to transmit or not
fdcan1_bi_semaphore = xSemaphoreCreateBinary();
xSemaphoreGive(fdcan1_bi_semaphore); //初始時,fdcan為ready狀態
/* Start the FDCAN module */
if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
/* Enable interrupts */
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
{
Error_Handler();
}
//HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY , 0);/* 开启 TXFIFO 空中断 */
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY , 0) != HAL_OK)
{
Error_Handler();
}
}
void fdcan1_transmit_task(void *args __attribute__((unused))) {
//fdcan_txq_element fdcan_transmit_txq_element;
uint8_t tx_data[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
for (;;) {
FDCAN_TxHeaderTypeDef fdcan_TxHeader={0};
fdcan_TxHeader.Identifier =0x001;// 0x00000205; //ex:0x205參考kde 請求temperture
fdcan_TxHeader.IdType = FDCAN_STANDARD_ID;//FDCAN_STANDARD_ID;//FDCAN_EXTENDED_ID;
fdcan_TxHeader.TxFrameType = FDCAN_DATA_FRAME;//FDCAN_REMOTE_FRAME:遙控幀, FDCAN_DATA_FRAME:數據幀
fdcan_TxHeader.DataLength = FDCAN_DLC_BYTES_8;
fdcan_TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
fdcan_TxHeader.BitRateSwitch = FDCAN_BRS_OFF;//FDCAN_BRS_ON;
fdcan_TxHeader.FDFormat = FDCAN_CLASSIC_CAN;//FDCAN_FD_CAN;
fdcan_TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;//FDCAN_NO_TX_EVENTS;//DCAN_STORE_TX_EVENTSㄥ
fdcan_TxHeader.MessageMarker = 0;
if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1,&fdcan_TxHeader,tx_data) != HAL_OK)
{
db_printf(DB_ALWAYS, "fdcan tram no\n");
}else
{
db_printf(DB_ALWAYS, "fdcan tram\n");
}
vTaskDelay(pdMS_TO_TICKS(1000)); //以下兩者差異
}
// else {
//}
}
}
/*
* @brief Tx Transfer completed callbacks.
* @param hfdcan: fdcan handle
* @return None
*/
//void HAL_fdcan_TxCpltCallback(FDCAN_HandleTypeDef *hfdcan) {
void HAL_FDCAN_TxFifoEmptyCallback(FDCAN_HandleTypeDef *hfdcan){
SemaphoreHandle_t *tmp_semphr = NULL;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if (hfdcan->Instance == FDCAN1) {
tmp_semphr = &fdcan1_bi_semaphore;
} else {
return;
}
db_printf(DB_ALWAYS, "tx finish\n");
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY , 0) == HAL_OK)
{
}
xSemaphoreGiveFromISR(*tmp_semphr, &xHigherPriorityTaskWoken);
//Determine if context switch is needed
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
感謝 |
-
|