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

📄 spi.c

📁 enc28j60-ok 我已经调试好的哟哈
💻 C
字号:
#include   "config.h"
const u32_t MCP2515_SCK = (1 << 22);     //P1.22 SCK
const u32_t MCP2515_CS  = (1 << 11);     //P0.11 CS
const u32_t MCP2515_SO  = (1 << 12);     //P0.12 SO
const u32_t MCP2515_SI  = (1 << 13);     //P0.13 SI

const u32_t X5043_SCK = (1 << 20);       //P0.20 SCK
const u32_t X5043_CS  = (1 << 23);       //P0.23 CS
const u32_t X5043_SO  = (1 << 28);       //P1.28 SO
const u32_t X5043_SI  = (1 << 29);       //P1.29 SI

const u32_t ENC28J60_SCK = (1 << 17);       //P0.17 SCK
const u32_t ENC28J60_CS  = (1 << 16);       //P0.16 CS
const u32_t ENC28J60_SO  = (1 << 30);       //P1.30 SO
const u32_t ENC28J60_SI  = (1 << 20);       //P1.20 SI
/*******************************************************************************
*名称: IniSPI()    初始化SPI

*功能: 初始化
*******************************************************************************/
void  IniSPI ( void )
{
    OS_ENTER_CRITICAL();
                                              //设置P0.13 SI P0.12 SO P0.11 CS(MCP2515)//P0.20 SCK|P0.23 CS(X5403)// P0.17 SCK |P0.16 CS(ENC28J60)
                                              //设置SO,SI,CS,SCK为GPIO(X5403)  
    PINSEL2 = (PINSEL2 & 0xfffffff0);         //无JTAG,全为GPIO

    IO0DIR  |= MCP2515_CS | MCP2515_SI;       //SI,CS输出(MCP2515) P0.13 SI  P0.11 CS
    IO1DIR  |= MCP2515_SCK;                   //SCK输出            P1.22 SCK    
    IO0DIR  &=~(MCP2515_SO);                  //SO输入             P0.12 SO
    IO1CLR  |= MCP2515_SCK;                   //SK=0
    IO0CLR  |= MCP2515_SI;                    //SI=0

    IO0DIR  |= X5043_SCK | X5043_CS;          //SCK,CS输出(X5043)  P0.20 SCK|P0.23 CS
    IO1DIR  |= X5043_SI;                      //SI输出             P1.29 SI    
    IO1DIR  &=~(X5043_SO);                    //SO输入             P1.28 SO
    IO0CLR  |= X5043_SCK;                     //SK=0
    IO1CLR  |= X5043_SI;                      //SI=0

    IO0DIR  |= ENC28J60_SCK | ENC28J60_CS;    //SCK,CS输出(ENC28J60) P0.17 SCK |P0.16 CS
    IO1DIR  |= ENC28J60_SI;                   //SI输出             P1.20 SI    
    IO1DIR  &=~(ENC28J60_SO);                 //SO输入             P1.30 SO
    IO0CLR  |= ENC28J60_SCK;                  //SK=0               
    IO1CLR  |= ENC28J60_SI;                   //SI=0
    OS_EXIT_CRITICAL();
}
/*******************************************************************************
*名称: WriteSPI()    写SPI一个字节

*功能: 写SPI一个字节
const u32_t MCP2515_SCK = (1 << 22);     //P1.22 SCK
const u32_t MCP2515_CS  = (1 << 11);     //P0.11 CS
const u32_t MCP2515_SO  = (1 << 12);     //P0.12 SO
const u32_t MCP2515_SI  = (1 << 13);     //P0.13 SI
*******************************************************************************/
void WriteSPI (u8_t  data)
{
    u8_t i=0;
    IO1CLR |= MCP2515_SCK;                                  //SK=0
    for ( i=0; i<8 ;i++ )
    {    
        if ( (data & 0x80)==0 )
        { 
            IO0CLR |= MCP2515_SI;                           //SI=0
        }
        else 
        {
            IO0SET |= MCP2515_SI;                           //SI=1
        }      
        IO1SET |= MCP2515_SCK;                              //SK=1
        data = data << 1;
        IO1CLR |= MCP2515_SCK;                              //SK=0
    }
}

/*******************************************************************************
*名称: ReadSPI()    读SPI一个字节

*功能: 读SPI一个字节
const u32_t MCP2515_SCK = (1 << 22);     //P1.22 SCK
const u32_t MCP2515_CS  = (1 << 11);     //P0.11 CS
const u32_t MCP2515_SO  = (1 << 12);     //P0.12 SO
const u32_t MCP2515_SI  = (1 << 13);     //P0.13 SI
*******************************************************************************/
u8_t  ReadSPI  ( void )
{
    u8_t i=0;
    u32_t bdata1=0;
    u8_t cdata = 0;
    IO1CLR |= MCP2515_SCK;                                  //SK=0
    for ( i=0; i<8 ;i++ )
    {
        IO1SET |= MCP2515_SCK;                              //SK=1
        cdata  = cdata << 1;
        bdata1  = IO0PIN & MCP2515_SO;                      //SO          
        if ( bdata1) 
        {
            cdata = cdata | 0x01;
        }
        else
        {
            cdata = cdata & (~0x01);
        }
        
        IO1CLR |= MCP2515_SCK;                        //SK=0
    }
    return cdata;
}

/*******************************************************************************
*名称: X5043_WriteSPI()    写SPI一个字节

*功能: 写SPI一个字节
const u32_t X5043_SCK = (1 << 20);       //P0.20 SCK
const u32_t X5043_CS  = (1 << 23);       //P0.23 CS
const u32_t X5043_SO  = (1 << 28);       //P1.28 SO
const u32_t X5043_SI  = (1 << 29);       //P1.29 SI
*******************************************************************************/
void X5043_WriteSPI (u8_t  data)
{
    u8_t i=0;
    IO0CLR |= X5043_SCK;                                    //SK=0
 
    for ( i=0; i<8 ;i++ )
    {    
        if ( (data & 0x80)==0 )
        { 
            IO1CLR |= X5043_SI;                             //SI=0
        }
        else 
        {
            IO1SET |= X5043_SI;                             //SI=1
        }
        IO0SET |= X5043_SCK;                                //SK=1
        data = data << 1;
        IO0CLR |= X5043_SCK;                                //SK=0 
    }
}

/*******************************************************************************
*名称: X5043_ReadSPI()    读SPI一个字节

*功能: 读SPI一个字节
const u32_t X5043_SCK = (1 << 20);       //P0.20 SCK
const u32_t X5043_CS  = (1 << 23);       //P0.23 CS
const u32_t X5043_SO  = (1 << 28);       //P1.28 SO
const u32_t X5043_SI  = (1 << 29);       //P1.29 SI
*******************************************************************************/
u8_t  X5043_ReadSPI  ( void )
{
    u8_t i=0;
    u32_t bdata1=0;
    u8_t cdata = 0;
    IO0CLR |= X5043_SCK;                                    //SK=0   
    for ( i=0; i<8 ;i++ )
    {

        IO0SET |= X5043_SCK;                                //SK=1
        cdata  = cdata << 1;
        bdata1  = IO1PIN;
        bdata1  = bdata1 & X5043_SO;                        //SO          
        if ( bdata1) 
        {
            cdata = cdata | 0x01;
        }
        else
        {
            cdata = cdata & (~0x01);
        }
        
        IO0CLR |= X5043_SCK;                               //SK=0
    }
    return cdata;
}

/*******************************************************************************
*名称: ENC28J60_WriteSPI()    写SPI一个字节

*功能: 写SPI一个字节
const u32_t ENC28J60_SCK = (1 << 17);       //P0.17 SCK
const u32_t ENC28J60_CS  = (1 << 16);       //P0.16 CS
const u32_t ENC28J60_SO  = (1 << 30);       //P1.30 SO
const u32_t ENC28J60_SI  = (1 << 20);       //P1.20 SI
*******************************************************************************/
void ENC28J60_WriteSPI (u8_t  data)
{
    u8_t i=0;
    IO0CLR |= ENC28J60_SCK;                                //SK=0
    for ( i=0; i<8 ;i++ )
    {    
        if ( (data & 0x80)==0 )
        { 
            IO1CLR |= ENC28J60_SI;                          //SI=0
        }
        else 
        {
            IO1SET |= ENC28J60_SI;                          //SI=1
        }    
        IO0SET |= ENC28J60_SCK;                             //SK=1
        data = data << 1;
        IO0CLR |= ENC28J60_SCK;                             //SK=0
    }
}

/*******************************************************************************
*名称: ENC28J60_ReadSPI()    读SPI一个字节

*功能: 读SPI一个字节
const u32_t ENC28J60_SCK = (1 << 17);       //P0.17 SCK
const u32_t ENC28J60_CS  = (1 << 16);       //P0.16 CS
const u32_t ENC28J60_SO  = (1 << 30);       //P1.30 SO
const u32_t ENC28J60_SI  = (1 << 20);       //P1.20 SI
*******************************************************************************/
u8_t  ENC28J60_ReadSPI  ( void )
{
    u8_t i=0;
    u32_t bdata1=0;
    u8_t cdata = 0;
    IO0CLR |= ENC28J60_SCK;                                 //SK=0
    for ( i=0; i<8 ;i++ )
    {
        IO0SET |= ENC28J60_SCK;                             //SK=1
        cdata  = cdata << 1;
        bdata1  = IO1PIN & ENC28J60_SO;                     //SO          
        if ( bdata1) 
        {
            cdata = cdata | 0x01;
        }
        else
        {
            cdata = cdata & (~0x01);
        }
        
        IO0CLR |= ENC28J60_SCK;                             //SK=0
    }
    return cdata;
}





























⌨️ 快捷键说明

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