0 寻求MC9S12G系列的CAN模块的源代码,对我的代码差错 - - 21ic电子技术开发论坛
打印
[8/16-bit MCU]

寻求MC9S12G系列的CAN模块的源代码,对我的代码差错

[复制链接]
2395|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
longlianqing|  楼主 | 2015-10-20 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RT,求MC9S12G的初始化和发送接收的源代码!自己写了一个但是不能成功发送出数据!以下是我自己的源代码,包含初始化和发送模块,更希望有个大大帮我找出其中的!!!红色段是复制的别人的,不太懂那两个寄存器!
/******************************************************************************
Function Name:    CAN_Init()
Engineer:                  created by Huanglongjie
Date:                  9/24/2015
Arguments:              none  
Return:           none
MCU:              MC9S12G48
function:         CAN Init               
caution:          baud rate = 125khz;
                  CANE which is write once in normal,(now I only turn on rreceive interrupt)
           
******************************************************************************/
void MSCAN_Init(void)
{
    CANCTL1_CANE = 1;//enable MSCAN
   
    CANCTL0 = 0b00101100;//Enable internal MSCAN timer,The MSCAN is able to restart,
                         //The module ceases to be clocked during wait mode                     
                        
    CANCTL0_INITRQ = 1;//gointo  initialization mode
                        
    while(CANCTL1_INITAK != 1)
    {
        ;//wait for going into CAN initialization mode
    }
   
                        
    CANCTL1 = 0b11000100;//clock source is the bus clock
                         //Automatic bus-off recovery ,MSCAN wakes up only in case of
                         //a dominant pulse on the CAN bus that has a length of Twup
                        
    CANBTR0 = 0b01001111;//Synchronization Jump Width max = 2 Tq clock cycles and  Tq = 1us
   
    CANBTR1 = 0b00100011;//Time Segment 2 = 3tq,Time Segment 1 = 4tq;=>baud rate = 125khz
   
    CANRIER = 0b00000001;//enable receive buffer full interrupt
   
    CANIDAC = 0b00010000;//Four 16-bit acceptance filters
   
   [color=Red] ////////////////////////////////////////////////////////////////////////
    CANIDAR0 = 0x20;                    /* Filter 0, ID=0x100 Standard Identifier */
    CANIDMR0 = 0x00;
    CANIDAR1 = 0x00;
    CANIDMR1 = 0x07;                    /* AM[2:0] = 7 to receive standard identifiers */

    CANIDAR2 = 0x00;                    /* Filter 1, ID=0x0000 */
    CANIDMR2 = 0x00;
    CANIDAR3 = 0x00;
    CANIDMR3 = 0x07;                    /* AM[2:0] = 7 to receive standard identifiers */

    CANIDAR4 = 0x00;                        /* Filter 2, ID=0x0000 */
    CANIDMR4 = 0x00;
    CANIDAR5 = 0x00;
    CANIDMR5 = 0x07;                    /* AM[2:0] = 7 to receive standard identifiers */

    CANIDAR6 = 0x00;                          /* Filter 3, ID=0x0000 */
    CANIDMR6 = 0x00;
    CANIDAR7 = 0x00;
    CANIDMR7 = 0x07;                    /* AM[2:0] = 7 to receive standard identifiers */[/color]
   
    ////////////////////////////////////////////////////////////////////////
    CANCTL0_INITRQ = 0;//MSCAN restarts and then tries to synchronize to the CAN bus,gointo normol mode
   
    while(CANCTL1_INITAK);//wait gointo normol mode
    {
        ;
    }
   
    while(CANCTL0_SYNCH == 0)
    {
        ;//wait that MSCAN is synchronized to the CAN bus
    }
   
   
    CANR标志寄存器 = 0xc3;                                            /*reset some flags */
   
   
}




/******************************************************************************
Function Name:    CAN_Send_Data_Frame()
Engineer:                  created by Huanglongjie
Date:                  9/24/2015
Arguments:              none  
Return:           none
MCU:              MC9S12G48
function:         CAN_Send_Data_Frame
caution:         

*******************************************************************************/
UINT MSCAN_Send_Data_Frame(UINT id,UCHAR can_send_msg[])
{
    UCHAR id_low7bit = 0,id_high4bit = 0,buffer_select_flag = 0,send_success_flag = 0;
    UINT  overflow_cnt = 0;
   
    /*do
    {
        buffer_empty_flag = CANT标志寄存器;   
    }while(buffer_empty_flag == 0x00);//show all tx buffer is full,wait tx buffer is empty*/
   
   
    if(CANT标志寄存器 != 0x00)//exist empty tx buffer?
    {
        CANTBSEL = CANT标志寄存器;//selecet corresponding buffer
        
        buffer_select_flag = CANTBSEL;//return value of selected tx buffer id
        
        id_low7bit = id&0x007f;
        id_high4bit = (id&0x0780)/64;//calculate id
        
        CANTXDSR0 = can_send_msg[0];
        CANTXDSR1 = can_send_msg[1];
        CANTXDSR2 = can_send_msg[2];
        CANTXDSR3 = can_send_msg[3];
        CANTXDSR4 = can_send_msg[4];
        CANTXDSR5 = can_send_msg[5];
        CANTXDSR6 = can_send_msg[6];
        CANTXDSR7 = can_send_msg[7];
        
   
        CANTXIDR0 = 0x00;               
        CANTXIDR1 = 0x00;
        CANTXIDR2 = id_high4bit;
        CANTXIDR3 = (id_low7bit*2)+0;//+0 show is data frame not is Remote frame
        CANTXDLR = 0x08;//DLC = 8;
   
        CANTXIDR1_IDE = 0;//frame is Standard format
        
        CANTXTBPR = 0x08;
        
        CANT标志寄存器 = buffer_select_flag;//start transmission send data

        
        do
        {
            send_success_flag = buffer_select_flag & CANT标志寄存器;//not is 0 show successful
            overflow_cnt ++;   
        }while((!send_success_flag)&&overflow_cnt < 5000);//wait send data successlly
        
        if(overflow_cnt < 5000)
        {
            return CAN_SEND_SUCCESS_FLAG;
        }
        else
        {
            return CAN_SEND_FAIL_FLAG;
        }
        
        
    }
    else
    {
        return CAN_SEND_FAIL_FLAG;
    }
  
}

相关帖子

沙发
longlianqing|  楼主 | 2015-10-20 20:03 | 只看该作者
代码里面“CAN标志寄存器” = “CANT标志寄存器”,莫名的被替换了。

使用特权

评论回复
板凳
longlianqing|  楼主 | 2015-10-20 20:04 | 只看该作者
初始化应该没太大问题,请大大主要帮看下发送程序块!求成功发送的源代码!!!

使用特权

评论回复
地板
攻城狮| | 2015-10-21 09:13 | 只看该作者
楼主可以参考一下分享的资料
https://bbs.21ic.com/icview-654618-1-1.html

使用特权

评论回复
5
史迪威将军| | 2015-10-21 20:56 | 只看该作者
longlianqing 发表于 2015-10-20 20:03
代码里面“CAN标志寄存器” = “CANT标志寄存器”,莫名的被替换了。

看看你的发送的时序和要求的时序一致吗?

使用特权

评论回复
6
Luis德华| | 2015-10-22 08:46 | 只看该作者
能确定初始化有没有问题?

使用特权

评论回复
7
longlianqing|  楼主 | 2015-10-24 20:45 | 只看该作者
问题已经解决,初始化没问题,是发送那块的问题!谢谢!

使用特权

评论回复
8
longlianqing|  楼主 | 2015-10-24 20:46 | 只看该作者
史迪威将军 发表于 2015-10-21 20:56
看看你的发送的时序和要求的时序一致吗?

一致的,发送那块问题!

使用特权

评论回复
9
Luis德华| | 2015-10-24 21:16 | 只看该作者
硬件有没有错误啊?

使用特权

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

本版积分规则

5

主题

33

帖子

3

粉丝