⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcp2510.c

📁 msp430下使用mcp2510can芯片的源代码
💻 C
字号:
#include  "msp430x13x.h"
#include  "mcp2510.h"
#include  "math.h"
uchar mcp_RD_address(uchar address);

void nop(uchar time)
{
    uchar i;
    for(i=0;i<time;i++);
}

//清看门狗程序
void ClearWDT (void)
{
  WDTCTL=WDT_ARST_250;//看门狗模式,ACLK,250mS
  P3OUT ^=WDI;
}

uchar Get_CAN_address(void)
{
    uchar address;
    address = P1IN & 0xF0;
    address >>= 4;
    address = address-2;
    address *= 4;
    return address;
}
/* This function produce a byte on the SPI communication */
uchar SPI_putch(uchar outdata)
{
   TXBUF0 = outdata;
   while (!(TXEPT & UTCTL0));      // TX finish    
   return RXBUF0;
}
/* Select the MCP2510 by hardware signal CS */
void mcp_select(void)
{
    P3OUT &= ~mcpCS0;               // MCP2510 SELECT        
}

/* Remove the CS from the MCP */
void mcp_unselect(void)
{
    P3OUT |= mcpCS0; 	
}

void mcp_reset(void)
{ 
    uint i;  
    P2OUT&=~RST0;    
    for(i=0;i<50000;i++); 
    ClearWDT();
    for(i=0;i<50000;i++); 
    P2OUT|=RST0;
    
}

uchar mcp_RD_address(uchar address)
{
    uchar store=0X55; 
    mcp_select( );                 // Select the mcp2510    
    SPI_putch(READ);               // Write the command     
    SPI_putch(address);            // Write address 
    store = SPI_putch(DUMMY);      // Write dummy byte to produce clock    
    mcp_unselect( );
    return store;
    
}

void mcp_WR_address(uchar address,uchar output)
{    
    mcp_select( );                 // Select the mcp2510    
    SPI_putch( WRITE );            // Write the command      
    SPI_putch( address );          // Write the address       
    SPI_putch( output );           // Write byte in address     
    mcp_unselect( );
}

uchar mcp_RD_status(void)
{
    uchar store;
    mcp_select( );                 // Select the mcp2510    
    SPI_putch(RD_STAT);            // Write the command    
    store =  SPI_putch(DUMMY);     // Write any byte to get a byte in return     
    mcp_unselect( );
    return store;                  // Command done OK
}

void mcp_write_bits(uchar address,uchar mask,uchar data)
{
    mcp_select();
    SPI_putch(BIT_MOD);
    SPI_putch(address);
    SPI_putch(mask);
    SPI_putch(data);
    mcp_unselect();
}

// TXnumber can be 0,1,2
void mcp_RTS(uchar TXnumber)
{  
    uchar temp;
    switch(TXnumber)
    {
        case 0:
             temp = 0x81;
             break;
        case 1:
             temp = 0x82;
             break;
        case 2:
             temp = 0x84;
             break;
        default:
             break;    
    }
    mcp_select( );     // Select the mcp2510   
    SPI_putch(temp);   // Write the command   
    mcp_unselect();        
}

/* Read one or more registers in the MCP2510, starting at address
   readdata.  */
void mcp_read( uchar address, uchar* readdata, uchar length )
{
    uchar loopCnt;
    mcp_select();               // Select the MCP device at the SPI bus     
    for (loopCnt=0; loopCnt < length; loopCnt++) 
    {        
        *readdata=mcp_RD_address(address);  // reading
        address++;                          // Increment the pointers to next location
        readdata++;
    }
    mcp_unselect();
}

/* Write to one or more registers in the MCP2510, starting at address
   writedata.  */
void mcp_write( uchar address, uchar* writedata, uchar length )
{
    uchar loopCnt;   
    mcp_select();      
    for (loopCnt=0; loopCnt < length; loopCnt++) 
    {        
        mcp_WR_address(address++,*(writedata++)); 
    }
    mcp_unselect();
}

// RXnumber can be 0,1
void mcp_read_can( uchar RXnumber, uchar* data )
{   
    uchar dlc; 
    uchar mcp_addr = RXnumber*16 + 0x61;       
    mcp_read( mcp_addr+4, &dlc, 1 );    
    dlc &= DLC_MASK;
    mcp_read( mcp_addr+5, data, dlc );
}

// TXnumber can be 0,1,2
void mcp_write_can( uchar TXnumber,uchar number,uchar dlc,uchar* data )
{
    uchar canid;
    uchar mcp_addr = TXnumber*16 + 0x31;
    canid = Get_CAN_address();
    mcp_write(mcp_addr, &canid, 1 );       // write TXBNSIDH     
    canid = 0;
    mcp_write((mcp_addr+1),&canid, 0);     // write  TXBNSIDL
    mcp_write((mcp_addr+2),&canid, 0);     // write  TXBNEID8
    mcp_write((mcp_addr+3),&canid, 0);     // write  TXBNEID0
    mcp_write((mcp_addr+4), &dlc,  1);     // write data length   
    mcp_write((mcp_addr+5), &number, 1);   // write frame number   
    mcp_write((mcp_addr+6), data, (dlc-1));   // write data bytes    
}

/* Initialize the MCP2510.  */
void init_can(void)
{
    uchar tmp=0;    
    
    mcp_reset( ); 
    mcp_WR_address(CNF1,0x00);          //16M crystal , 1000KBPS; TQ=125ns, Synchronization Jump Width Length:1TQ
    mcp_WR_address(CNF2,0x90);          //one sample, Phase Segment 1 Length:3TQ, Propagation Segment Length:1TQ
    mcp_WR_address(CNF3,0x02);          //Phase Segment 2 Length : 3TQ
    mcp_WR_address(TXRTSCTRL,0x00);     //Disable RTS PINs    
    mcp_WR_address(TXB0CTRL,0x03);      //Lowest Message Priority   
    mcp_WR_address(TXB1CTRL,0x02);      //High Intermediate Message Priority
    mcp_WR_address(TXB2CTRL,0x00);      //Highest Message Priority  
    
    mcp_WR_address(BFPCTRL,0x00);       //disable RX PINs
    mcp_WR_address(RXB0CTRL,0x00);      //0x00, normal ; Rollover disenabled ; Acceptance Filter 0 (RXF0)   
    mcp_WR_address(RXF0SIDH,Get_CAN_address());      //RXF0SIDH        
    mcp_WR_address(RXF0SIDL,0x00);      //RXF0SIDL      
    mcp_WR_address(RXM0SIDH,0xff);      //RXM0SIDH   
    mcp_WR_address(RXM0SIDL,0xff);      //RXM0SIDL   
    
    mcp_WR_address(CANINTE,0x00);
    mcp_WR_address(CANINTF,0x00);       //INTERRUPT FLAG
    
    tmp=mcp_RD_address(CNF2); 
    mcp_WR_address(CANCTRL,RQM_NORMAL);    
    tmp=mcp_RD_address(CANSTAT);       
    tmp &= 0xE0; 
    while(tmp!=0)    
    { 
        mcp_WR_address(CANCTRL,RQM_CONFIG);                      
        mcp_WR_address(CANCTRL,RQM_NORMAL);         
        tmp=mcp_RD_address(CANSTAT); 
        tmp &= 0xE0;                
    } 
     
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -