打印
[Kinetis]

K60_CAN通信问题:苏州大学例程问题

[复制链接]
3258|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
//============================================================================
// 工程名称: gaozu                          
// 硬件连接: 无                                       
// 程序描述: 见工程说明
// 时间:2013.12.11   
//========================================

//头文件
#include "includes.h"


// 定义全局变量
extern int periph_clk_khz;
uint8   CANReData[8];        //接收到的数据
uint8   CANReDataLen;        //接收到的数据长度
uint8   CANReFlag=1;         //接收到数据标志
uint32  localMsgID = 0x0B;   //本机ID
uint32  serverMsgID= 0x0A;  //主机ID
uint32  rxMsgID;            //接收到的ID号
uint32  txMsgID;            //发送ID号
uint32  IDNodeB    = 0x0B;  //Node B的ID号
uint32  IDNodeC    = 0x0C;  //Node C的ID号
//====================全局变量定义========

//==========函数声明======================

//===========(结束)=======================
//主函数
void main()
{   
//===========局部变量声明=================
          uint16 result=0;
        uint8  Data[16] = "CAN_DATA";
        uint8  DataNodeB[16] = "IamNodeB";
        uint32 CANbaud =1000;    //波特率 83KHz
        uint32 mCANSendCounter=0;
        uint8  CANSendFlag = 1;
        uint8  i;
        uint8  selfLoop = 0;   //1=回环测试模式,0=正常模式
        uint8  idMask   = 1;   //1=ID屏蔽,0=ID不屏蔽
//=========================初始化========================================
    DisableInterrupts;    //禁止总中断
    LED_init();
    adc_init(ADC0, DP1);  //adc初始化
    CANInit(CAN_NUM_TEST,CANbaud,selfLoop,idMask);   //CAN模块初始化
    hw_uart_init (UART_TEST,TEST_UART_BAUDRATE);//uart初始化
    hw_uart_enable_re_int(UART_TEST);
    CANEnableRXBuff(CAN_NUM_TEST,FLEXCAN_RX_MB_START,localMsgID);//使能接收缓冲区
    EnableCANInterrupt(CAN_NUM_TEST,FLEXCAN_RX_MB_START);//使能CAN的MB中断  
    EnableInterrupts; //开总中断
//==================主程序初始化===============================
     printf("*********K60 CAN_Bus Node B Test******\r\n");   

//===========主循环(开始)======================================================
while(1)
       {  
          LED_turn(LED0);
          mCANSendCounter++;
            if(mCANSendCounter > 20000)
            {
          
                     mCANSendCounter = 0;   //清除计数器
                txMsgID = localMsgID;
                DisableCANInterrupt(CAN_NUM_TEST,FLEXCAN_RX_MB_START);//关CAN的MB中断
                      if(CANSendData(CAN_NUM_TEST,FLEXCAN_TX_MB_START, txMsgID, 8, DataNodeB)==0)
                {
                      hw_uart_send_string(UART_TEST,(uint8 *)"\r\n\r\nCAN send data : ");  
                for(i = 0;i < 8;i++)
                        hw_uart_send1(UART_TEST,DataNodeB[i]);
                      hw_uart_send_string(UART_TEST,(uint8 *)"\r\n");       
                  hw_uart_send_string(UART_TEST,(uint8 *)"CAN send   ID : 0x");
                  hw_uart_send_hex_number(UART_TEST,txMsgID);
                  hw_uart_send_string(UART_TEST,(uint8 *)"  Successfully!\r\n\r\n");
                }
                EnableCANInterrupt(CAN_NUM_TEST,FLEXCAN_RX_MB_START);//开CAN的MB中断
               
             }
            //3. CAN接收数据处理
            if(0==CANReFlag)  
            {
                    DisableCANInterrupt(CAN_NUM_TEST,FLEXCAN_RX_MB_START);//关CAN的MB中断
                      CANReFlag = 1;   
                      hw_uart_send_string(UART_TEST,(uint8 *)"CAN receive rxMsgID : 0x");
                      hw_uart_send_hex_number(UART_TEST,rxMsgID);
                      hw_uart_send_string(UART_TEST,(uint8 *)"\r\n");
                      hw_uart_send_string(UART_TEST,(uint8 *)"CAN receive  length : 0x");
                      hw_uart_send_hex_number(UART_TEST,CANReDataLen);
                      hw_uart_send_string(UART_TEST,(uint8 *)"\r\n");
                      hw_uart_send_string(UART_TEST,(uint8 *)"CAN receive    data : ");  
                      for(i = 0;i < CANReDataLen;i++)
                      {
                         hw_uart_send1(UART_TEST,CANReData[i]);
                      }
                      hw_uart_send_string(UART_TEST,(uint8 *)"\r\n");       
                      hw_uart_send_string(UART_TEST,(uint8 *)"\r\n");
                    EnableCANInterrupt(CAN_NUM_TEST,FLEXCAN_RX_MB_START);//开CAN的MB中断
            }
    }// end for
    //主循环结束============================================================================
} // end_main

串口调试结果为下图,为啥刚发送的数据又被重新接收回来了?请大神帮忙看看


QQ截图20140611214556.png (27.63 KB )

QQ截图20140611214556.png

相关帖子

沙发
jd972594| | 2014-6-12 10:27 | 只看该作者
楼主难道没接CAN的另一端设备?
自测模式的?

使用特权

评论回复
板凳
FSL_TICS_Robin| | 2014-6-12 11:00 | 只看该作者
楼主你好
没有用过苏大的库
不过你可以修改CANx_MCR寄存器的SRXDIS位

使用特权

评论回复
地板
774729254|  楼主 | 2014-6-13 09:52 | 只看该作者
jd972594 发表于 2014-6-12 10:27
楼主难道没接CAN的另一端设备?
自测模式的?

不是自测模式啊。另一端有C8051F040的can接收,结果测的现象像是自测模式下。求指教

使用特权

评论回复
5
774729254|  楼主 | 2014-6-13 09:58 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-12 11:00
楼主你好
没有用过苏大的库
不过你可以修改CANx_MCR寄存器的SRXDIS位

你好,你用过K60的can吗,可以参考一下你的底层库吗,

使用特权

评论回复
6
FSL_TICS_Robin| | 2014-6-13 10:24 | 只看该作者
774729254 发表于 2014-6-13 09:58
你好,你用过K60的can吗,可以参考一下你的底层库吗,

没有调试过这个模块,但ZJJ版主有分享过一篇【经验分享】K40D100M CW PE工程的 CAN回环测试程序
你是否有修改过那个寄存器呢?


使用特权

评论回复
7
FSL_TICS_Robin| | 2014-6-13 10:25 | 只看该作者
774729254 发表于 2014-6-13 09:58
你好,你用过K60的can吗,可以参考一下你的底层库吗,

你在调用底层库的时候,是否可以修改一下该寄存器设置呢?

使用特权

评论回复
8
jd972594| | 2014-6-13 13:27 | 只看该作者
774729254 发表于 2014-6-13 09:52
不是自测模式啊。另一端有C8051F040的can接收,结果测的现象像是自测模式下。求指教 ...

要不利用ID屏蔽把自己的ID给屏蔽了?

使用特权

评论回复
9
774729254|  楼主 | 2014-6-14 10:56 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-13 10:25
你在调用底层库的时候,是否可以修改一下该寄存器设置呢?

恩,好的,我试试

使用特权

评论回复
10
774729254|  楼主 | 2014-6-18 09:55 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-13 10:25
你在调用底层库的时候,是否可以修改一下该寄存器设置呢?

你好,那个自发自收的问题解决了,谢谢你,现在想设置关闭打开PIT定时器,可是怎么设置都无效,可以帮我看看吗?/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:pit_init
*  功能说明:PITn定时中断
*  参数说明:PITn        模块号(PIT0~PIT3)
             cnt         延时时间(单位为bus时钟周期)
*  函数返回:无
*  修改时间:2012-1-24
*  备    注:
*************************************************************************/
void pit_init(PITn pitn, uint32 cnt)
{
    //PIT 用的是 Bus Clock 总线频率
    //溢出计数 = 总线频率 * 时间

    /* 开启时钟*/
    SIM_SCGC6       |= SIM_SCGC6_PIT_MASK;                            //使能PIT时钟

    /* PIT模块控制 PIT Module Control Register (PIT_MCR) */
    PIT_MCR         &= ~(PIT_MCR_MDIS_MASK | PIT_MCR_FRZ_MASK );      //使能PIT定时器时钟 ,调试模式下继续运行

    /* 定时器加载值设置 Timer Load Value Register (PIT_LDVALn) */
    PIT_LDVAL(pitn)  = cnt;                                          //设置溢出中断时间

    //定时时间到了后,TIF 置 1 。写1的时候就会清0
    PIT_Flag_Clear(pitn);                                             //清中断标志位
    /* 定时器控制寄存器 Timer Control Register (PIT_TCTRL0) */
     PIT_TCTRL(pitn) |= PIT_TCTRL_TIE_MASK ;   //使能 PITn定时器,并开PITn中断
     enable_irq(pitn + 68);         //开接收引脚的IRQ中断
}
void pit_en(PITn pitn)//打开定时器,
{
   PIT_TCTRL(pitn) |= PIT_TCTRL_TEN_MASK;
}
void pit_dis(PITn pitn)//关闭定时器
{
   PIT_TCTRL(pitn) &=~PIT_TCTRL_TEN_MASK;                                         //开接收引脚的IRQ中断
}

使用特权

评论回复
11
FSL_TICS_Robin| | 2014-6-18 10:21 | 只看该作者
774729254 发表于 2014-6-18 09:55
你好,那个自发自收的问题解决了,谢谢你,现在想设置关闭打开PIT定时器,可是怎么设置都无效,可以帮我 ...

恭喜楼主问题解决了,建议你把这第二个问题独立发帖讨论。

使用特权

评论回复
12
FSL_TICS_Robin| | 2014-6-18 10:22 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-18 10:21
恭喜楼主问题解决了,建议你把这第二个问题独立发帖讨论。

OK 已经看到你的帖子了
这个帖子如果你有空还请配合我们结帖。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

299

帖子

1

粉丝