ESWIN-EAM2011实现CAN和CAN FD通信(中断)

来公司实习,被安排使用这款国产RISC-V架构芯片做开发,从期待到裂开到想死@#*&%#&¥*(此处省略无数字),希望给使用这款芯片的小伙伴一些参考。欢迎大家私信交流,目前搞完CAN和CANFD的项目在翻越另一个项目大山的途中举步维艰......(第一是因为我刚出来实习经验不足,第二是这款芯片是23年底才上市的还处于测试阶段,内部资料和开发环境都还在更新中)

两个程序都是使用CAN0和CAN2进行通信,收到信息进入中断再由另一个CAN模块发送出去

Application文件夹下面包含board(时钟、引脚、can、uart模块配置)和src(main.c)两个文件夹,代码都在main.c里面

CAN

链接:https://pan.baidu.com/s/1HasRE6zly49pjKlTY7SQgg 
提取码:sail

/**  @addtogroup main_module main module documentation
 *  @{
 */
/* MODULE main */

/* Including necessary configuration files. */
#include "sdk_project_config.h"
#include "flexcan_driver.h"
#include "flexcan_register.h"
#include "flexcan_hw_access.h"
#include "pins_hw_access.h"
#include <stdbool.h>
#include <stdint.h>
#include "log.h"

flexcan_msgbuff_t recvBuff;
const flexcan_id_table_t id_filter_table [3]     = {
			{false, false, 0},
			{false, false, 1},
			{false, false, 0x3DA}
	};

void SendCanStandardData(uint8_t index,uint32_t mailbox, flexcan_msgbuff_t txMsg)
{
	uint32_t mask=1<<21;
    flexcan_data_info_t dataInfo;
    dataInfo.data_length = 8;
	if((recvBuff.cs&mask)!=0){
		/*EXT*/
		dataInfo.msg_id_type = FLEXCAN_MSG_ID_EXT;
	}else{
		/*STD*/
		dataInfo.msg_id_type = FLEXCAN_MSG_ID_STD;
	}
//    dataInfo.msg_id_type = FLEXCAN_MSG_ID_STD;
    dataInfo.enable_brs  = false;
	dataInfo.fd_enable   = false;
	dataInfo.fd_padding  = 0U;
	dataInfo.is_remote =false;

	FLEXCAN_DRV_ConfigTxMb(index, 10, &dataInfo, txMsg.msgId);
    FLEXCAN_DRV_Send(index, 10, &dataInfo, txMsg.msgId, txMsg.data);
}

//flexcan_callback_t myFlexCanCallback(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState);

void myFlexCanCallback(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState)
{

	if(eventType==FLEXCAN_EVENT_RXFIFO_COMPLETE){
		FLEXCAN_DRV_RxFifo(instance, &recvBuff);
		uint32_t canx;
		canx=instance==INST_FLEXCAN_0?INST_FLEXCAN_2:INST_FLEXCAN_0;
		SendCanStandardData(INST_FLEXCAN_2,10,recvBuff);
	}
}

void flexcan_init(void){
	FLEXCAN_DRV_Init(INST_FLEXCAN_0, &g_stFlexcanState_0, &g_stFlexcan0UserConfig0);
	FLEXCAN_DRV_InstallEventCallback(INST_FLEXCAN_0,myFlexCanCallback,NULL);

	FLEXCAN_DRV_Init(INST_FLEXCAN_2, &g_stFlexcanState_2, &g_stFlexcan2UserConfig0);
	FLEXCAN_DRV_InstallEventCallback(INST_FLEXCAN_2,myFlexCanCallback,NULL);

	FLEXCAN_DRV_ConfigRxFifo(INST_FLEXCAN_0,FLEXCAN_RX_FIFO_ID_FORMAT_A,id_filter_table);
	FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_0,FLEXCAN_MSG_ID_STD,0);
	FLEXCAN_DRV_RxFifo(INST_FLEXCAN_0, &recvBuff);

	FLEXCAN_DRV_ConfigRxFifo(INST_FLEXCAN_2,FLEXCAN_RX_FIFO_ID_FORMAT_A,id_filter_table);
	FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_2,FLEXCAN_MSG_ID_STD,0);
	FLEXCAN_DRV_RxFifo(INST_FLEXCAN_2, &recvBuff);
}

int _write(int file, char *ptr, int len)
{
	UART_DRV_SendDataBlocking(INST_UART_1, (uint8_t *)ptr, len, 10U);
//	UART_DRV_SendData(INST_UART_0, (uint8_t *)ptr, len);
	return len;
}

int main(void)
{
	PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_stPinmuxConfigArr);
	CLOCK_SYS_Init(g_pstClockManConfigsArr[0]);
	UART_DRV_Init(INST_UART_1, &g_stUartState_0, &g_stUart0UserConfig0);
	printf("main\n");
	flexcan_init();
	while(1){

	}
}

CAN FD

链接:https://pan.baidu.com/s/1C7yeQoZF-WtRHmSbkJTbdg 
提取码:sail

/**  @addtogroup main_module main module documentation
 *  @{
 */
/* MODULE main */

/* Including necessary configuration files. */
#include "sdk_project_config.h"
#include "flexcan_driver.h"
#include "flexcan_register.h"
#include "flexcan_hw_access.h"
#include "pins_hw_access.h"
#include <stdbool.h>
#include <stdint.h>
#include "log.h"
uint32_t mask=1<<21;
uint32_t EDL=1<<31;
uint32_t BRS=1<<30;
flexcan_msgbuff_t recvBuff;
const flexcan_id_table_t id_filter_table [3]     = {
			{false, false, 0},
			{false, false, 1},
			{false, false, 0x3DA}
	};
const flexcan_enhancedIdTableType_t id_filter_tablefd[4] = {
        {FLEXCAN_ENHANCED_RX_FIFO_ONE_ID_FILTER, false, false, false, 1, 0},
        {FLEXCAN_ENHANCED_RX_FIFO_ONE_ID_FILTER, false, false, false, 2, 0},
        {FLEXCAN_ENHANCED_RX_FIFO_ONE_ID_FILTER, true , false, false, 1, 0},
        {FLEXCAN_ENHANCED_RX_FIFO_ONE_ID_FILTER, true , false, false, 2, 0},
};

int _write(int file, char *ptr, int len)
{
	UART_DRV_SendDataBlocking(INST_UART_1, (uint8_t *)ptr, len, 10U);
//	UART_DRV_SendData(INST_UART_0, (uint8_t *)ptr, len);
	return len;
}

void SendCanData(uint8_t index,uint32_t mailbox, flexcan_msgbuff_t txMsg)
{

    flexcan_data_info_t dataInfo;
    dataInfo.data_length = txMsg.dataLen;
	if((recvBuff.cs&mask)!=0){
		/*EXT*/
		dataInfo.msg_id_type = FLEXCAN_MSG_ID_EXT;
	}else{
		/*STD*/
		dataInfo.msg_id_type = FLEXCAN_MSG_ID_STD;
	}
//    dataInfo.msg_id_type = FLEXCAN_MSG_ID_STD;

	if((recvBuff.cs&EDL)!=0){
			dataInfo.fd_enable  = true;
			if((recvBuff.cs&BRS)!=0){
	 				dataInfo.enable_brs   = true;
			}else{
				dataInfo.enable_brs   = false;
			}
			dataInfo.fd_padding  = 0xFF;
		}else{
		    dataInfo.enable_brs  = false;
			dataInfo.fd_enable   = false;
			dataInfo.fd_padding  = 0U;
		}
	dataInfo.is_remote =false;

//	FLEXCAN_DRV_ConfigTxMb(index, 10, &dataInfo, txMsg.msgId);
    FLEXCAN_DRV_Send(index, 10, &dataInfo, txMsg.msgId, txMsg.data);
}

//flexcan_callback_t myFlexCanCallback(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState);

void myFlexCanCallback(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState)
{

	if(eventType==FLEXCAN_EVENT_ENHANCED_RXFIFO_COMPLETE){
		FLEXCAN_DRV_RxFifo(instance, &recvBuff);
		uint32_t canx;
		canx=instance==INST_FLEXCAN_0?INST_FLEXCAN_2:INST_FLEXCAN_0;
		SendCanData(canx,10,recvBuff);
	}
}

void flexcan_init(void){
	FLEXCAN_DRV_Init(INST_FLEXCAN_0, &g_stFlexcanState_0, &g_stFlexcan0UserConfig0);
	FLEXCAN_DRV_InstallEventCallback(INST_FLEXCAN_0,myFlexCanCallback,NULL);

	FLEXCAN_DRV_Init(INST_FLEXCAN_2, &g_stFlexcanState_2, &g_stFlexcan2UserConfig0);
	FLEXCAN_DRV_InstallEventCallback(INST_FLEXCAN_2,myFlexCanCallback,NULL);

	FLEXCAN_DRV_ConfigEnhancedRxFifo(INST_FLEXCAN_0, id_filter_tablefd);
	FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_0,FLEXCAN_MSG_ID_STD,0);
	FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_0,FLEXCAN_MSG_ID_EXT,0);
	FLEXCAN_DRV_RxFifo(INST_FLEXCAN_0, &recvBuff);

	FLEXCAN_DRV_ConfigEnhancedRxFifo(INST_FLEXCAN_2, id_filter_tablefd);
	FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_2,FLEXCAN_MSG_ID_STD,0);
	FLEXCAN_DRV_SetRxFifoGlobalMask(INST_FLEXCAN_2,FLEXCAN_MSG_ID_EXT,0);
	FLEXCAN_DRV_RxFifo(INST_FLEXCAN_2, &recvBuff);
}

int main(void)
{
	PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_stPinmuxConfigArr);
	CLOCK_SYS_Init(g_pstClockManConfigsArr[0]);
	UART_DRV_Init(INST_UART_1, &g_stUartState_0, &g_stUart0UserConfig0);
	printf("main\n");
	PINS_DRV_WritePin(PORTD,2,1);
	flexcan_init();
	while(1){
	}
}

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值