This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我尝试使用示例代码进行 CAN 通信
C:\ti\controlSUITE\device_support\f2807x\v180\F2807x_examples_CPU1\CAN_loopback_interrupts
我面临2个问题
1。
我将其保持在外部回送模式并更改其 GPIO 引脚、但将 GPIO31-CANTXA 更改为 GPIO31以外的其他内容、例如 GPIO_SetupPinMux (32、GPIO_MUX_CPU1、1)、将发生错误、 我发现发生错误的点是 ulStatus &~(CAN_ES_TXOK | CAN_ES_RXOK)== 5、这有什么问题?
2.
我删除了外部回送模式并将其更改为 CAN 通信。 对 HWREG (CANA_base + CAN_O_CTL)进行注释|= CAN_CTL_TEST;HWREG (CANA_base + CAN_O_TEST)= CAN_TEST_EXL;
将 GPIO 设置更改为 GPIO_SetupPinMux (70、GPIO_MUX_CPU1、6);
// GPIO31-CANTXA
GPIO_SetupPinMux (71、GPIO_MUX_CPU1、6);
GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);
我可以发送消息,但仍然无法接收消息。 我是否错过了什么?
完整代码如下:
//######################################################################################################################
//文件:CAN_loopback_interrupts.c
//标题:演示基本 CAN 设置和使用的示例。
//
//! addtogroup cpu01_example_list
//!
#include "F28x_Project.h"//设备头文件和示例 include 文件
#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ca.h"
#include "driverlib/CAN.h"
//
//跟踪 TX 中断次数的计数器
//发生,它应与发送的 TX 消息数匹配。
//
volatile unsigned long g_ulTxMsgCount = 0;
volatile unsigned long g_ulRxMsgCount = 0;
int i;
//unsigned long u32CanAErrorStatus;
//unsigned long uCanaErrFlag;
//
//指示发生了某些传输错误的标志。
//
volatile unsigned long g_BErrFlag = 0;
tCANMsgObject sTXCANMessage;
tCANMsgObject sRXCANMessage;
unsigned char ucTXMsgData[8]={0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00};
unsigned char ucRXMsgData[8];
//unsigned long u32CntTXMsgData = 0x12345678;
//
//此函数是 CAN 外设的中断处理程序。 它会进行检查
//查找中断原因,并保留所有消息的计数
//已传输。
//
中断无效
CANIntHandler (空)
{
unsigned long ulStatus;
//读取 CAN 中断状态以查找中断原因
ulStatus = CANIntStatus (CANA_base、CAN_INT_STS_Cause);
//如果原因是控制器状态中断,则获取状态
if (ulStatus = CAN_INT_INT0ID_STATUS)
{
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。 如果
// CAN 外设未与其它 CAN 器件连接到 CAN 总线
//存在,则会发生错误,并在中指示
//控制器状态。
ulStatus = CANStatusGet (CANA_base、CAN_STS_CONTROL);
//检查是否发生错误。
if (((ulStatus &~(CAN_ES_TXOK | CAN_ES_RXOK))!= 7)&&
((ulStatus &~(CAN_ES_TXOK | CAN_ES_RXOK))!= 0)){
//设置一个标志来指示可能发生的某些错误。
G_bErrFlag = 1;
}
}
//检查原因是否是我们正在使用的消息对象1
//发送消息。
否则、如果(ulStatus = 1)
{
//到达这一点意味着 TX 中断发生在上
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
CANIntClear (CANA_base、1);
//递增计数器以跟踪已有多少消息
//已发送。 在实际应用中、这可用于将标志设置为
//指示何时发送消息。
G_ulTxMsgCount++;
//由于消息已发送,请清除所有错误标志。
G_bErrFlag = 0;
}
//检查原因是否是我们正在使用的消息对象1
//接收消息。
否则、如果(ulStatus = 2)
{
//获取收到的消息
CANMessageGet (CANA_base、2、&sRXCANMessage、true);
//到达这一点意味着 TX 中断发生在上
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
CANIntClear (CANA_base、2);
//递增计数器以跟踪已有多少消息
//已发送。 在实际应用中、这可用于将标志设置为
//指示何时发送消息。
G_ulRxMsgCount++;
//由于消息已发送,请清除所有错误标志。
G_bErrFlag = 0;
}
//否则,发生意外导致中断的情况。 这应该是
//永远不会发生。
其他
{
//可以在此处执行伪中断处理。
}
//canaRegs.CAN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1;
CANGLALIntClear (CANA_base、CAN_GLB_INT_CANINT0);
PieCtrlRegs.PIEACX.ALL = PIEACK_group9;
}
//
//配置 CAN 并输入循环以传输周期性 CAN 消息。
//
int main (空)
{
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2807x_sysctrl.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 F2807x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
InitGpio();
//GPIO 73 - XCLKOUT
//GPIO_SetupPinMux (73、GPIO_MUX_CPU1、3);
//GPIO_SetupPinOptions (73、GPIO_OUTPUT、GPIO_PushPull);//-> SYSCLOCK/8 = 25MHz
//GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;
//GpioCtrlRegs.GPADIR.bit.GPIO10=0;
//GpioDataRegs.GPADAT.bit.GPIO10=0;
//GPIO30 - CANRXA
GPIO_SetupPinMux (70、GPIO_MUX_CPU1、6);
//GPIO31 - CANTXA
GPIO_SetupPinMux (71、GPIO_MUX_CPU1、6);
GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);
//GPIO30 - CANRXB
//GPIO_SetupPinMux (73、GPIO_MUX_CPU1、6);
//GPIO31 - CANTXB
//GPIO_SetupPinMux (72、GPIO_MUX_CPU1、6);
//GPIO_SetupPinOptions (73、GPIO_INPUT、GPIO_异 步);
//GPIO_SetupPinOptions (72、GPIO_OUTPUT、GPIO_PushPull);
//初始化 CAN 控制器
CANInit (CANA_base);
//CANInit (CANB_BASE);
//设置可以从 PLL 输出时钟计时
CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟*
//设置 CAN 总线的比特率。 此函数设置 CAN
针对标称配置的//总线时序。 您可以实现更多控制
//使用函数 CANBitTimingSet()代替 CAN 总线时序
//如果需要。
//在此示例中、CAN 总线设置为500kHz。 在以下函数中、
//对 SysCtlClockGet ()的调用用于确定该时钟速率
//用于为 CAN 外设计时。 可将其替换为
//固定值如果您知道系统时钟的值,则节省额外的值
//函数调用。 对于某些器件、CAN 外设采用固定计时
// 8MHz,无论在哪种情况下调用的系统时钟如何
// SysCtlClockGet ()应替换为80000。 请查阅数据
//表以了解有关 CAN 外设计时的更多信息。
CANBitRateSet (CANA_base、120000000、50000);
//CANBitRateSet (CANA_base、120000000、1000000);
//在 CAN 外设上启用中断。 此示例使用静态
//分配中断处理程序,表示处理程序的名称
//位于启动代码的矢量表中。 如果您想使用动态的
//分配矢量表,然后还必须调用 CANIntRegister()
//此处。
//CANIntEnable (CANA_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2807x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2807x_DefaultIsr.c 中找到 shell ISR 例程
//此函数位于 F2807x_PieVect.c 中
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//在 RAM 矢量表中注册中断处理程序
EALLOW;
PieVectTable.CANA0_INT = CANIntHandler;
EDIS;
//在处理器(PIE)上启用 CAN 中断。
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
IER |= 0x0100;/* M_INT9 */
EINT;
//启用测试模式并选择外部环回
//HWREG (CANA_base + CAN_O_CTL)|= CAN_CTL_TEST;
//HWREG (CANA_base + CAN_O_TEST)= CAN_TEST_EXL;
//启用 CAN 以进行操作。
CANEnable (CANA_base);
//CANEnable (CANB_BASE);
CANGLALIntEnable (CANA_base、CAN_GLB_INT_CANINT0);
//初始化将用于发送 CAN 的消息对象
//消息。 消息将是包含一个递增的4个字节
//值。 最初它将设置为0x12345678。
//ucTXMsgData[0]=(u32CntTXMsgData>>24)& 0xFF;
//ucTXMsgData[1]=(u32CntTXMsgData>16)和0xFF;
//ucTXMsgData[2]=(u32CntTXMsgData>>8)和0xFF;
//ucTXMsgData[3]=(u32CntTXMsgData)& 0xFF;
sTXCANMessage.ui32MsgID = 1;// CAN 消息 ID -使用1
sTXCANMessage.ui32MsgIDMask = 0;// TX 无需掩码
sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;//在 TX 上启用中断
sTXCANMessage.ui32MsgLen = sizeof (ucTXMsgData);//消息大小为8
sTXCANMessage.pucMsgData = ucTXMsgData;// ptr 至消息内容
//初始化将用于接收 CAN 的消息对象
//消息。
*(unsigned long *) ucRXMsgData = 0;
sRXCANMessage.ui32MsgID = 1;// CAN 消息 ID -使用1
sRXCANMessage.ui32MsgIDMask = 0;// TX 无需掩码
sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;//MSG_OBJ_USE_EXT_FILTER | MSG_OBJ_EXDED_ID;//启用 RX 上的中断
sRXCANMessage.ui32MsgLen = sizeof (ucRXMsgData);//消息大小为8
sRXCANMessage.pucMsgData = ucRXMsgData;// ptr 至消息内容
//设置用于接收消息的消息对象
CANMessageSet (CANA_base、2、&sRXCANMessage、MSG_OBJ_TYPE_RX);
//使用对象1发送 CAN 消息(与不一样
// CAN ID、在本例中也是1)。 此函数将导致
//要立即传输的消息。
ucTXMsgData[0]= 0x12;
ucTXMsgData[1]= 0x34;
ucTXMsgData[2]= 0x56;
ucTXMsgData[3]= 0x78;
//输入循环以发送消息。 根据、将发送一条新消息
//秒。 4字节的消息内容将被视为无符号
// long 并每次递增1。
for (;;)
{
//检查错误标志以查看是否发生错误
if (g_bErrFlag)
{
asm (" ESTOP0");
}
if (g_ulTxMsgCount = g_ulRxMsgCount){
CANMessageSet (CANA_base、1、&sTXCANMessage、MSG_OBJ_TYPE_TX);
}否则{
//g_BErrFlag = 1;
}
//现在等待1秒后再继续
DELAY_US (1000*1000);
//递增发送消息数据中的值。
ucTXMsgData[0]+= 0x01;
ucTXMsgData[1]+= 0x01;
ucTXMsgData[2]+= 0x01;
ucTXMsgData[3]+= 0x01;
}
}
尊敬的 Lin:
如果您查看数据表(信号说明部分)、则 GPIO32上没有用于 CAN 功能的多路复用器选项。 您不仅可以选择 GPIO、还可以随意地将其分配为 CAN 通道。
对于第二个问题、可以将 GPIO70连接为 CANRXA、但多路复用器位置是5、而不是代码中的6。 GPIO71可以作为 CANTXA 连接、但多路复用器位置也是5、而不是代码中显示的6。 同样、请参阅 数据表、了解您需要使用的 CAN 通道的正确多路复用器分配。
此致、
Joseph
您好、Casuga、
感谢您的回复、
我成功解决了第一个问题、在另一个数据表中找到了多路复用器选项设置。
但第二个问题仍然没有解决。我更改了 GPIO 设置
GPIO_SetupPinMux (70、GPIO_MUX_CPU1、5); GPIO_SetupPinMux (71、GPIO_MUX_CPU1、 5);
我在变量中写入"ulStatus"、并观察 到它是5
新的完整代码如下所示:
//######################################################################################################################
//文件:CAN_loopback_interrupts.c
//标题:演示基本 CAN 设置和使用的示例。
//
//! addtogroup cpu01_example_list
//!
#include "F28x_Project.h"//设备头文件和示例 include 文件
#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ca.h"
#include "driverlib/CAN.h"
//
//跟踪 TX 中断次数的计数器
//发生,它应与发送的 TX 消息数匹配。
//
volatile unsigned long g_ulTxMsgCount = 0;
volatile unsigned long g_ulRxMsgCount = 0;
//int i;
//unsigned long u32CanAErrorStatus;
//unsigned long uCanaErrFlag;
//
//指示发生了某些传输错误的标志。
//
volatile unsigned long g_BErrFlag = 0;
tCANMsgObject sTXCANMessage;
tCANMsgObject sRXCANMessage;
unsigned char ucTXMsgData[8]={0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00};
unsigned char ucRXMsgData[8];
unsigned long ii;
无符号长整型 aa;
//unsigned long u32CntTXMsgData = 0x12345678;
//
//此函数是 CAN 外设的中断处理程序。 它会进行检查
//查找中断原因,并保留所有消息的计数
//已传输。
//
中断无效
CANIntHandler (空)
{
unsigned long ulStatus;
//读取 CAN 中断状态以查找中断原因
ulStatus = CANIntStatus (CANA_base、CAN_INT_STS_Cause);
//如果原因是控制器状态中断,则获取状态
if (ulStatus = CAN_INT_INT0ID_STATUS)
{
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。 如果
// CAN 外设未与其它 CAN 器件连接到 CAN 总线
//存在,则会发生错误,并在中指示
//控制器状态。
ulStatus = CANStatusGet (CANA_base、CAN_STS_CONTROL);
//检查是否发生错误。
if (((ulStatus &~(CAN_ES_TXOK | CAN_ES_RXOK))!= 7)&&
((ulStatus &~(CAN_ES_TXOK | CAN_ES_RXOK))!= 0)){
//设置一个标志来指示可能发生的某些错误。
G_bErrFlag = 1;
}
}
//检查原因是否是我们正在使用的消息对象1
//发送消息。
否则、如果(ulStatus = 1)
{
//到达这一点意味着 TX 中断发生在上
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
CANIntClear (CANA_base、1);
//递增计数器以跟踪已有多少消息
//已发送。 在实际应用中、这可用于将标志设置为
//指示何时发送消息。
G_ulTxMsgCount++;
//由于消息已发送,请清除所有错误标志。
G_bErrFlag = 0;
}
//检查原因是否是我们正在使用的消息对象1
//接收消息。
否则、如果(ulStatus = 2)
{
//获取收到的消息
CANMessageGet (CANA_base、2、&sRXCANMessage、true);
//到达这一点意味着 TX 中断发生在上
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
CANIntClear (CANA_base、2);
//递增计数器以跟踪已有多少消息
//已发送。 在实际应用中、这可用于将标志设置为
//指示何时发送消息。
G_ulRxMsgCount++;
//由于消息已发送,请清除所有错误标志。
G_bErrFlag = 0;
}
//否则,发生意外导致中断的情况。 这应该是
//永远不会发生。
其他
{
//可以在此处执行伪中断处理。
}
II=ulStatus;
AA=(ulStatus &~(CAN_ES_TXOK | CAN_ES_RXOK));
//canaRegs.CAN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1;
CANGLALIntClear (CANA_base、CAN_GLB_INT_CANINT0);
PieCtrlRegs.PIEACX.ALL = PIEACK_group9;
}
//
//配置 CAN 并输入循环以传输周期性 CAN 消息。
//
int main (空)
{
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2807x_sysctrl.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 F2807x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
InitGpio();
//GPIO 73 - XCLKOUT
//GPIO_SetupPinMux (73、GPIO_MUX_CPU1、3);
//GPIO_SetupPinOptions (73、GPIO_OUTPUT、GPIO_PushPull);//-> SYSCLOCK/8 = 25MHz
//GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;
//GpioCtrlRegs.GPADIR.bit.GPIO10=0;
//GpioDataRegs.GPADAT.bit.GPIO10=0;
//GPIO30 - CANRXA
GPIO_SetupPinMux (70、GPIO_MUX_CPU1、5);
//GPIO31 - CANTXA
GPIO_SetupPinMux (71、GPIO_MUX_CPU1、5);
GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);
//GPIO30 - CANRXB
//GPIO_SetupPinMux (73、GPIO_MUX_CPU1、6);
//GPIO31 - CANTXB
//GPIO_SetupPinMux (72、GPIO_MUX_CPU1、6);
//GPIO_SetupPinOptions (73、GPIO_INPUT、GPIO_异 步);
//GPIO_SetupPinOptions (72、GPIO_OUTPUT、GPIO_PushPull);
//初始化 CAN 控制器
CANInit (CANA_base);
//CANInit (CANB_BASE);
//设置可以从 PLL 输出时钟计时
CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟*
//设置 CAN 总线的比特率。 此函数设置 CAN
针对标称配置的//总线时序。 您可以实现更多控制
//使用函数 CANBitTimingSet()代替 CAN 总线时序
//如果需要。
//在此示例中、CAN 总线设置为500kHz。 在以下函数中、
//对 SysCtlClockGet ()的调用用于确定该时钟速率
//用于为 CAN 外设计时。 可将其替换为
//固定值如果您知道系统时钟的值,则节省额外的值
//函数调用。 对于某些器件、CAN 外设采用固定计时
// 8MHz,无论在哪种情况下调用的系统时钟如何
// SysCtlClockGet ()应替换为80000。 请查阅数据
//表以了解有关 CAN 外设计时的更多信息。
CANBitRateSet (CANA_base、120000000、250000);
//CANBitRateSet (CANA_base、120000000、1000000);
//在 CAN 外设上启用中断。 此示例使用静态
//分配中断处理程序,表示处理程序的名称
//位于启动代码的矢量表中。 如果您想使用动态的
//分配矢量表,然后还必须调用 CANIntRegister()
//此处。
CANIntEnable (CANA_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2807x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2807x_DefaultIsr.c 中找到 shell ISR 例程
//此函数位于 F2807x_PieVect.c 中
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//在 RAM 矢量表中注册中断处理程序
EALLOW;
PieVectTable.CANA0_INT = CANIntHandler;
EDIS;
//在处理器(PIE)上启用 CAN 中断。
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
IER |= 0x0100;/* M_INT9 */
EINT;
//启用测试模式并选择外部环回
//HWREG (CANA_base + CAN_O_CTL)|= CAN_CTL_TEST;
//HWREG (CANA_base + CAN_O_TEST)= CAN_TEST_EXL;
//启用 CAN 以进行操作。
CANEnable (CANA_base);
//CANEnable (CANB_BASE);
CANGLALIntEnable (CANA_base、CAN_GLB_INT_CANINT0);
//初始化将用于发送 CAN 的消息对象
//消息。 消息将是包含一个递增的4个字节
//值。 最初它将设置为0x12345678。
//ucTXMsgData[0]=(u32CntTXMsgData>>24)& 0xFF;
//ucTXMsgData[1]=(u32CntTXMsgData>16)和0xFF;
//ucTXMsgData[2]=(u32CntTXMsgData>>8)和0xFF;
//ucTXMsgData[3]=(u32CntTXMsgData)& 0xFF;
sTXCANMessage.ui32MsgID = 1;// CAN 消息 ID -使用1
sTXCANMessage.ui32MsgIDMask = 0;// TX 无需掩码
sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;//在 TX 上启用中断
sTXCANMessage.ui32MsgLen = sizeof (ucTXMsgData);//消息大小为8
sTXCANMessage.pucMsgData = ucTXMsgData;// ptr 至消息内容
//初始化将用于接收 CAN 的消息对象
//消息。
*(unsigned long *) ucRXMsgData = 0;
sRXCANMessage.ui32MsgID = 1;// CAN 消息 ID -使用1
sRXCANMessage.ui32MsgIDMask = 0;// TX 无需掩码
sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;//MSG_OBJ_USE_EXT_FILTER | MSG_OBJ_EXDED_ID;//启用 RX 上的中断
sRXCANMessage.ui32MsgLen = sizeof (ucRXMsgData);//消息大小为8
sRXCANMessage.pucMsgData = ucRXMsgData;// ptr 至消息内容
//设置用于接收消息的消息对象
CANMessageSet (CANA_base、2、&sRXCANMessage、MSG_OBJ_TYPE_RX);
//使用对象1发送 CAN 消息(与不一样
// CAN ID、在本例中也是1)。 此函数将导致
//要立即传输的消息。
ucTXMsgData[0]= 0x12;
ucTXMsgData[1]= 0x34;
ucTXMsgData[2]= 0x56;
ucTXMsgData[3]= 0x78;
//输入循环以发送消息。 根据、将发送一条新消息
//秒。 4字节的消息内容将被视为无符号
// long 并每次递增1。
for (;;)
{
//检查错误标志以查看是否发生错误
if (g_bErrFlag)
{
asm (" ESTOP0");
}
if (g_ulTxMsgCount = g_ulRxMsgCount){
CANMessageSet (CANA_base、1、&sTXCANMessage、MSG_OBJ_TYPE_TX);
}否则{
//g_BErrFlag = 1;
}
//现在等待1秒后再继续
//delay_US (1000*1000);
//递增发送消息数据中的值。
ucTXMsgData[0]+= 0x01;
ucTXMsgData[1]+= 0x01;
ucTXMsgData[2]+= 0x01;
ucTXMsgData[3]+= 0x01;
}
}
尊敬的 Lin:
您正在使用哪种硬件? 它是 TI 发布的还是其他设计? 在您的代码中没有明显的问题。
此致、
Joseph