打印
[活动专区]

【赛元95F】 + 11、SC95F8617 CAN收发测试

[复制链接]
1358|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tlled|  楼主 | 2020-3-26 08:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tlled 于 2020-3-26 08:21 编辑

    在上一帖子  赛元95F】 + 10、SC95F8617 CAN发送测试 中增加接收功能。

    一、代码

   1.1、main.c

#include "config.h"

        uchar can_tx_buf[8];
        uchar can_rx_buf[14];

void main(void)
{
        uint i=0;
        uchar js=0;

         
        
        Init_led();
        Init_uart(32, 9600);
        uart_chl(1);   //usb-ttl
        Init_enit();
        Init_mcp2515();
        while(1)
        {
                js++;
                if(can_int_flag==1)
                {
                        can_int_flag=0;
                        
                        CAN_RecRXB(can_rx_buf);
                        CAN_Send(can_rx_buf);
                }
        }
}

    1.2、mcp2515.c

#include "config.h"

bit SPI0Flag;
bit can_int_flag=0;

void SPI0_Init(void)
{
        OTCON |= 0X10;    //SPI0
        US0CON0 = 0x3F;   
        US0CON1 = 0x01;   
        US0CON0 |= 0x80;  
        IE1 |= 0x01;
        EA = 1;
}

void SpiInt(void) interrupt 7   
{          
        if(US0CON1&0X08)   
        {
                US0CON1 &= ~0X08;
        }
        if(US0CON1&0X80)   //write eint
        {
                US0CON1 &= ~0X80;
                SPI0Flag = 1;
        }
}

void SPI0_WRITE(uchar dat)
{
        US0CON2 = dat;
        while(!SPI0Flag);
        SPI0Flag = 0;
}

uchar SPI0_READ(void)
{
        uchar rxdat;
        SPI0_WRITE(0x00);
        rxdat=US0CON2;;
        return rxdat;
}


void MCP2515_Reset(void)
{
        CAN_CS=0;
        SPI0_WRITE(CAN_RESET);
        CAN_CS=1;
}

void MCP2515_BitModity(uchar addr, uchar msk, uchar dat)
{
     CAN_CS=0;     
     SPI0_WRITE(CAN_BIT_MODIFY);      
     SPI0_WRITE(addr);                                                         
     SPI0_WRITE(msk);                                                                 
     SPI0_WRITE(dat);                                                         
     CAN_CS=1;
     return;
}

void SPI0_WriteByte(uchar adr,uchar dat)
{
        CAN_CS=0;
        SPI0_WRITE(CAN_WRITE);
        SPI0_WRITE(adr);
        SPI0_WRITE(dat);
        CAN_CS=1;
}

void CAN_Send(uchar *CAN_TX_Buf)
{
        uint i;
        MCP2515_BitModity(TXB0CTRL,0x08,0x00);   
        SPI0_WriteByte(TXB0SIDH,0x55);
        SPI0_WriteByte(TXB0SIDL,0x08);
        SPI0_WriteByte(TXB0EID8,0x55);
        SPI0_WriteByte(TXB0EID0,0x88);

        SPI0_WriteByte(TXB0DLC,DLC_8);         
        SPI0_WriteByte(TXB0D0,CAN_TX_Buf[0]);          
        SPI0_WriteByte(TXB0D1,CAN_TX_Buf[1]);
        SPI0_WriteByte(TXB0D2,CAN_TX_Buf[2]);
        SPI0_WriteByte(TXB0D3,CAN_TX_Buf[3]);
        SPI0_WriteByte(TXB0D4,CAN_TX_Buf[4]);
        SPI0_WriteByte(TXB0D5,CAN_TX_Buf[5]);
        SPI0_WriteByte(TXB0D6,CAN_TX_Buf[6]);
        SPI0_WriteByte(TXB0D7,CAN_TX_Buf[7]);
        CAN_CS=0;
        SPI0_WRITE(CAN_RTS | 0x01);               
        CAN_CS=1;
}

void Init_mcp2515(void)
{
        uint i;
        P0CON &= ~0x02;   //CANCS
        P0CON |= 0x02;
        P0PH |= 0x02;
       
        SPI0_Init();                   //SPI INIT
       
        MCP2515_Reset();
        for(i=0;i<5000;i++);
       
        MCP2515_BitModity(CANCTRL,0xE0,0x80);
        SPI0_WriteByte(CNF1,0x04);         //100k
        SPI0_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);                 
        SPI0_WriteByte(CNF3,PHSEG2_3TQ);                                                                                
        SPI0_WriteByte(CANINTF,0x00);                                                                       
        SPI0_WriteByte(CANINTE,0x03);       
       
        SPI0_WriteByte(RXB0CTRL,0x60);                                                                 
        //SPI0_WriteByte(RXB1CTRL,0x40);                                                           

        SPI0_WriteByte(RXM0SIDH,0xff);
        SPI0_WriteByte(RXM0SIDL,0xff);
        SPI0_WriteByte(RXM0EID8,0xff);
        SPI0_WriteByte(RXM0EID0,0xff);
       
//        SPI0_WriteByte(RXM1SIDH,0xff);
//        SPI0_WriteByte(RXM1SIDL,0xff);
//        SPI0_WriteByte(RXM1EID8,0xff);
//        SPI0_WriteByte(RXM1EID0,0xff);

        SPI0_WriteByte( BFPCTRL, 0 );                                                        
        SPI0_WriteByte( TXRTSCTRL, 0 );       
                                       
        MCP2515_BitModity(CANCTRL,0xE0,0x00);
}



uchar SPI0_ReadByte(uchar adr)
{
        uchar rxdat;

        CAN_CS=0;
        SPI0_WRITE(CAN_READ);         //???
        SPI0_WRITE(adr);                //???
        rxdat=SPI0_READ();
        CAN_CS=1;
        return rxdat;
}

void CAN_RecRXB(uchar *CAN_RX_Buf)
{

                CAN_RX_Buf[0]=SPI0_ReadByte(RXB0D0);                
                CAN_RX_Buf[1]=SPI0_ReadByte(RXB0D1);                
                CAN_RX_Buf[2]=SPI0_ReadByte(RXB0D2);
                CAN_RX_Buf[3]=SPI0_ReadByte(RXB0D3);
                CAN_RX_Buf[4]=SPI0_ReadByte(RXB0D4);
                CAN_RX_Buf[5]=SPI0_ReadByte(RXB0D5);
                CAN_RX_Buf[6]=SPI0_ReadByte(RXB0D6);
                CAN_RX_Buf[7]=SPI0_ReadByte(RXB0D7);       
                SPI0_WriteByte(CANINTF,0);                                                         
}
   1.3、eint.c
#include "config.h"


void Init_enit(void)
{
//        P2CON &= ~0x08;    //p2.3  
//       
//        INT2F |= 0x08;
//        INT2R |= 0x08;
       
        P1CON &= ~0x20 ;//P1.5   
        //P1CON |= 0x20;
        P1PH |= 0x20;
       
        INT1F |= 0x20;
//        INT1R |= 0x20;
        IE |= 0x04;       
        EA=1;
}

void EX1() interrupt        2
{
  
        if( (CAN_INT==0)||((CAN_INT==1)))  
        {
            can_int_flag=1;
        }
}

    二、测试结果

    CAN通信收到什么数据就发送什么数据。

   

使用特权

评论回复

相关帖子

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

本版积分规则

125

主题

691

帖子

6

粉丝