原创 MCP2515的使用(一)

2008-5-1 12:31 10241 7 10 分类: MCU/ 嵌入式

MCP2515的中文资料网上有很多,此,仅讨论具体的一些使用。先看下,在用ARM(LPC21XX)做控制器的情况下,用GPIO口模拟SPI总线的代码。


1.先看下SPI总线的时序图


SPI总线有四根线,CSSCKMISOMOSI,是一种环形总线结构,如下图。


CS是片选。


SCK是串行时钟。


MISO是主输入从输出。


MOSI是主输出从输入。


fa8f6f96-9907-49a6-b9f4-b74142e7b766.jpg


时序图如下:(参照MCP2515的数据手册)


SPI的输入时序


bfc41da1-4f55-45f5-b7d5-39f288eef2c8.jpg

SPI的输出时序


766b326e-319f-418f-8ef0-f283eb045ce2.jpg


2.分析下


Commands and data are sent to the device via the SI pin, with data being clocked in on the rising edge of SCK. Data is driven out by the MCP2515 (on the SO line) on the falling edge of SCK.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


命令和数据通过SI脚发到设备上,数据在SCK的上升沿写入。数据在SCK的下降沿SO输出


3.相应代码如下:(代码经使用是可行的,给出仅做参考)


/******************************************************************************


*名称: WriteSPI()    SPI一个字节


*功能: SPI一个字节


       P0.11            CS


       P0.12            SO


       P0.13            SI


       P1.22            SCK


******************************************************************************/


void  WriteSPI  (uint8  data)


{


    uint8 i;


    IO1CLR = IO1CLR | (1 << 22);                            //SK=0


    for ( i="0"; i<8 ;i++ )


    {   


        i = i;                                                                //延时


        if ( (data & 0x80)==0 )


        {


            IO0CLR = IO0CLR | (1 << 13);                    //SI=0


        }


        else


        {


            IO0SET = IO0SET | (1 << 13);                    //SI=1


        }


        i = i;      


        IO1SET = IO1SET | (1 << 22);                        //SK=1


        i = i;


        data = data << 1;


        IO1CLR = IO1CLR | (1 << 22);                        //SK=0


    }


}


 


/******************************************************************************


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


*功能: SPI一个字节


       P0.11            CS


       P0.12            SO


       P0.13            SI


       P1.22            SCK


******************************************************************************/


uint8  ReadSPI  ( void )


{


    uint8 i;


    uint32 bdata1,bdata2;


    uint8 cdata = 0;


    IO1CLR = IO1CLR | (1 << 22);                             //SK=0


    for ( i="0"; i<8 ;i++ )


    {


        i = i;                                                                 //延时


        i = i;


        IO1SET = IO1SET | (1 << 22);                         //SK=1


        cdata  = cdata << 1;


        bdata1  = IO0PIN & 0x00001000;                  //SO         


        i = i;


        bdata2  = IO0PIN & 0x00001000;


        if ( bdata1 != bdata2) return 0x00;               //验证下


        if ( bdata1)


        {


            cdata = cdata | 0x01;


        }


        else


        {


            cdata = cdata & (~0x01);


        }


       


        IO1CLR = IO1CLR | (1 << 22);                      //SK=0


    }


    return cdata;


}

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户1003858 2009-6-22 08:08

用模拟的SPI确实有点慢的。有条件还是用片上的SPI快多了。

用户1378954 2009-6-10 20:51

一般般 用模拟SPI控制 呵呵

用户384849 2009-3-6 21:05

不错,呵呵
相关推荐阅读
用户1003858 2014-03-04 11:18
电子花样机控制系统-常州数控技术研究所
CZSK-GE01花样机控制系统 CZSK-GE01是常州数控技术研究所自主研发的一款花样机控制系统,适用于电脑花样机G款,E款,210D款用途,系统采用模块化设计,可以应用于多种不同机型,可...
用户1003858 2014-03-03 16:31
三轴运动控制器-常州数控技术研究所
三轴控制器介绍 控制器由手持盒(CZSK02T)和控制器(CZSK02M)组成,两者通过串口连接,手持盒完成人机交互功能,图形化的示教方式生成用户轨迹文件,支持G代码导入,DXF图形导入,PL...
用户1003858 2010-06-28 09:08
ARM资料网站推荐
http://www.stmfans.com/bbs/?fromuid=4215 http://www.stmfans.com/bbs/?fromuser=cyzgod关于STM32的资料,值得一看哦...
用户1003858 2010-06-09 10:53
STM32 AD
关于STM32的12位AD,前些日子经过实际使用,使用外部电源参考,精度能达到11位,最起码能保证10位精度。可放心使用。...
用户1003858 2009-12-26 14:22
STM32 I2C使用
    用了STM32F103的I2C读写CAT1025的EEPROM,采用的是STM32给的固件例子,网上反映的问题也挺多的。说不好使,用了下,确实是它奶奶的郁闷。不过,也不是不能用。    首先,...
用户1003858 2009-10-16 17:58
常州数控培训
投身制造业的“黄埔军校”<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />常州数控培训...
EE直播间
更多
我要评论
3
7
关闭 站长推荐上一条 /3 下一条