主题中讨论的其他器件:C2000WARE
工具/软件:TI-RTOS
你(们)好
我通过 CAN 中断的控制程序有问题、我可以在电路板上发送 CAN 消息并从 ARM debian 获取
但是当我将消息从 debian 发送到 f28377时、它不起作用
此代码如下所示
main.c
/*
=== main.c ======
*/
#include
#include
#include
#include
#include
#include
#include
#include "F28x_Project.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ca.h"
#include "driverlib/ca.h"
#define CANRXA 70
#define CANTXA 71
#define MUXMODE 5
#define LED_BLUE 13
#define LED_RED 12
#define on 0
#define off 1
#define MSG_DATA_LENGTH 8
#define SCI_MSG_DATA_LENGTH 200
#define TX_MSG_OBJ_ID 1
#define RX_MSG_OBJ_ID 1 //为客户端
// CAN ID 设置 ID //
int CAN_ID = 0x000; //
volatile uint32_t txMsgCount = 0;
volatile uint32_t rxMsgCount = 0;
volatile uint32_t errorFlag = 0;
unsigned char txMsgData[char_data_length];
unsigned rxRXMsgData[char_data_length];
tCANMsgObject sTXMSG Message;tCANMSG Message
;tCANMSG 对象 CANMSG 对象 CANMSG 对象;CANMSG CANMSG
volatile bool dataRecibed = false;
bool mErrorFlag = false;
void initComponent();
void clear_CAN_TX (void);
void print_message();
/*
=== HwiFxn ====
*/
void canaISR (UArg arg)
{
if (dataRecibed == true){
GPIO_WritePin (LED_BLUE、OFF);
dataReciped == false;
}
否则{
GPIO_WritePin (LED_BLUE、ON);
dataReciped == true;
}
}
/*
=== myIdle ======
*/
void myIdleFxn (void){
while (1){
GPIO_WritePin (LED_RED、ON);
Task_sleep (100);
GPIO_WritePin (LED_RED、OFF);
Task_sleep (100);
}
}
/*
=== main ====
*/
int main(){
/*
*使用 ROV->SysMin 查看循环缓冲区中的字符
*
initComponent();
GPIO_WritePin (LED_BLUE、OFF);
GPIO_WritePin (LED_RED、OFF);
system_printf ("enter main()\n");
BIOS_start();/*不返回*/
return (0);
}
void initComponent(){
InitSysCtrl();
InitGpio();
GPIO_SetupPinMux (LED_BLUE、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (LED_BLUE、GPIO_OUTPUT、GPIO_PushPull);
GPIO_SetupPinMux (LED_RED、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (LED_RED、GPIO_OUTPUT、GPIO_PushPull);
GPIO_SetupPinMux (CANRXA、GPIO_MUX_CPU1、MUXMODE);//GPIO70 - CANRXA
GPIO_SetupPinOptions (CANRXA、GPIO_INPUT、GPIO_异 步);
GPIO_SetupPinMux (CANTXA、GPIO_MUX_CPU1、MUXMODE);//GPIO71 - CANTXA
GPIO_SetupPinOptions (CANTXA、GPIO_OUTPUT、GPIO_PushPull);
CANInit (CANA_base);
CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟
CANBitRateSet (CANA_base、200000000、50000);
CANIntEnable (CANA_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
sTXCANMessage.ui32MsgID = CAN_ID;
sTXCANMessage.ui32MsgIDMask = 0;
sTXCANMessage.ui32Flags = 0;
sTXCANMessage.ui32MsgLen = MSG_DATA_LENGTH;
sTXCANMessage.pucMsgData = txMsgData;
sRXCANMessage.ui32MsgID = CAN_ID;
sRXCANMessage.ui32MsgIDMask = 0;
sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
sRXCANMessage.ui32MsgLen = MSG_DATA_LENGTH;
sRXCANMessage.pucMsgData = rxMsgData;
CANMessageSet (CANA_base、RX_MSG_OBJ_ID、&sRXCANMessage、MSG_OBJ_TYPE_RX);
CANEnable (CANA_base);
}
void clear_CAN_TX (void){
int i;
for (i = 0;i < MSG_DATA_LENGTH;i++){
txMsgData[i]= 0;
}
}
//结束文件//
app.cfg
VAR Defaults = xdc.useModule('xdc.runtime.Defaults');
var Diags = xdc.useModule('xdc.runtime.Diags');
var Error = xdc.useModule('xdc.runtime.Error');
var Log = xdc.useModule('xdc.runtime.Log');
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
var Main = xdc.useModule('xdc.runtime.Main');
var SysMin = xdc.useModule('xdc.runtime.SysMin');
var System = xdc.useModule('xdc.runtime.System');
var Text = xdc.useModule('xdc.runtime.Text');
var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
VAR Boot = xdc.useModule('ti.catalog.c2800.initF2837x.Boot');
var Idle = xdc.useModule('ti.sysbios.knl.Idle');
/*
取消注释此行以全局禁用断言。
*所有模块继承'库'模块的默认值。 您
*可以使用 Module.common$按模块覆盖这些默认值。
*禁用断言将节省代码空间并提高运行时性能。
Defaults.common$.diags_ASSERT = Diags.always_off;
*/
*
取消注释此行以防止模块名称加载到目标上。
*模块名称字符串放置在.const 段中。 将此
*参数设置为 false 将节省.const 段中的空间。 错误和
*断言消息将包含"未知模块"前缀、而
不是*实际模块名称。
*/
Defaults.common$.namedModule = false;
/*
最小化系统中的退出处理程序数组。 System 模块包括
*一组函数,这些函数在 System_atexit()中注册,
*由 System_exit()调用。
//
System.maxAtexitHandlers = 4;
/*
取消注释此行以禁用错误打印功能。
*禁用时,我们会丢失错误信息,因为
*不打印错误。 如果
*由于 Error_print()函数
*调用 System_printf(),禁用 raiseHook 将节省一些代码空间。
error.raiseHook =空;
*/
/*
取消注释此行以防止*在
目标上加载错误、断言和日志字符串。 这些字符串放置在.const 段中。
*将此参数设置为 false 将节省.const 段中的空间。
*错误、断言和日志消息将打印原始 ID 和 args、而不是
*格式化的消息。
//
text.isLoaded = false;
//
*取消注释此行以在
程序退出时禁用 SysMin *的字符输出。 SysMin 向循环缓冲区写入字符。
*可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
//
SysMin.flushAtExit = false;
//
* BIOS 模块将为系统创建默认堆。
*指定此默认堆的大小。
//
bios.heapSize = 0x0;
//系统堆栈大小(由 ISR 和 Swi 使用)*/
Program.stack = 0x100;
// System_printf ()的循环缓冲区大小*/
sysmin.bufSize = 128;
//
*为整个系统创建并安装记录
器*/
var logerBufParams = new LoggerBufParams (
var LoggerBufParf);var loggerfParams = 4.buffs (创建并安装记录器);var loggerBufParfParams = loggerfParf4.
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.RUNTIME_ON;
System.SupportProxy = SysMin;
/*
构建自定义 BIOS 库。 自定义库将小于
*预编译的"已检测"(默认)和"未检测"库。
*
* BIOS.logsEnabled 参数指定
是否在此自定义构建的 BIOS 中启用日志记录*。 RTA 和
* UIA 分析工具使用这些日志。
*
* BIOS.sertsEnabled 参数指定 BIOS 代码是否
*包括 assert()检查。 将此参数设置为"false"将生成
*更小、更快的代码、但建议
在*早期开发中启用断言、因为断言()检查将捕获大量编程
*错误(无效参数等)
//
BIOS.libType = BIOS.LibType_Custom;
BIOS.logsEnabled = true;
BIOS.assertsEnabled = true;
//
*创建任务。 'taskFxn'函数可在 main.c 中找到。
var taskParams = new Task.Params ();
var task = Task.create ("&taskFxn"、taskParams);
*
///BIOS.cpufreq.lo = 200000000;
Main.common$.diags_STATUS = Diags.Runtime_off;
Boot.DataFlashWaitStates = true;taskLocks
=
true;configureBoot.enableCache = true;enableBoot.configureFlashClocks = true;
boot.SPLLIMULT = 40;
boot.OSCCLKSRCSEL = Boot.OSCCLK_INTOSC2;
Boot.SYSCLKDIVSEL = 1;
//BIOS.cpufreq.hi = 0;
BIOS.cpufreq.lo = 200000000;
var hwi0Params = new Hwi.Params ();
hwi0Params.instance.name ="hwiCANA";
hwi0Params.enableInt = true;
Program.global.hwiCANA = Hwi.create (100、"&canaISR"、 hwi0Params);
Idle.addFunc ("&myIdleFxn");
我的目标是当我向 f28377发送 CAN 消息时,它应该打开/关闭蓝色 LED (GPIO 13)。
空闲功能可以正常工作










