历史上的今天
返回首页

历史上的今天

今天是:2024年10月28日(星期一)

正在发生

2019年10月28日 | SPI协议工作过程详解文档,内含实例代码

2019-10-28 来源:51hei

SPI:一种3线(有的没有SS线(选择主或从机模式))或4线的通信方式:
           MOSI:主机出从机进数据线
                 MISO:主机进从机从数据线
                 SCK: 时钟线
                 SS:  主从模式选择线
工作过程的理解:设置好相应的配置后就可以发送或接收数据,当放送或接收完成后就会是SPIF置位,此时如果开了中断就会就入中断服务程序。如果没开中断就可以通过查询该标志位来做相应的事。进入中段服务程序后,或者读(写)SPDR寄存器都可以清零SPIF标志位。从而可以开始下一次的传输
相应的寄存器
1:SCPR:控制寄存器:SPI的大部分设置
2:SPSR:标志寄存器:(查看一些标志(主要是SPIF位)和设置SPI速度)
3:SPDR:数据寄存器:
SS引脚的说明:(实质就是当配置为输入时:是主机还是从机由输入的电平来决定)
从机模式: 当 SPI 配置为从机时,从机选择引脚 SS 总是为输入。SS 为低将激活 SPI 接口,MISO
成为输出 ( 用户必须进行相应的端口配置 ) 引脚,其他引脚成为输入引脚。当 SS 为高时
所有的引脚成为输入, SPI 逻辑复位,不再接收数据。
SS引脚对于数据包/字节的同步非常有用,可以使从机的位计数器与主机的时钟发生器同
步。当SS 拉高时SPI从机立即复位接收和发送逻辑,并丢弃移位寄存器里不完整的数据。

主机模式:当 SPI 配置为主机时 (SPCR 的 MSTR置位 ),用户可以决定 SS 引脚的方向。
若 SS 配置为输出,则此引脚可以用作普通的 I/O 口而不影响 SPI 系统。典型应用是用来
驱动从机的 SS 引脚。


如果 SS 配置为输入,必须保持为高以保证 SPI 的正常工作。若系统配置为主机,SS 为
输入,但被外设拉低,则 SPI 系统会将此低电平解释为有一个外部主机将自己选择为从
机。为了防止总线冲突, SPI 系统将实现如下动作:
1. 清零 SPCR 的 MSTR 位,使 SPI 成为从机,从而 MOSI 和 SCK变为输入。
2. SPSR 的 SPIF 置位。若 SPI 中断和全局中断开放,则中断服务程序将得到执行。
因此,使用中断方式处理 SPI 主机的数据传输,并且存在 SS 被拉低的可能性时,中断服
务程序应该检查 MSTR 是否为 "1”。若被清零,用户必须将其置位,以重新使能 SPI 主机
模式。
管脚配置

一:SCPR:控制寄存器:(SPI的大部分设置都在该寄存器)

二SPSR:标志寄存器:(查看一些标志和设置SPI速度,主要是用到SPIF这个标志位,接收完成和发送完成都会置位这个标志,进入中断服务程序或访问SPDR寄存  器都可以清零这个标志)

三SPDR:数据寄存器:



应用步骤:

1先根据是主还是从设置端口的模式(输入还是输出)

主机:SS   MOSI   SCK 为出 MISO为入

从机:SS   MOSI   SCK 为入 MISO 为出

2配置相应的寄存器(就三个寄存器,注意用到中断时要先开总中断)

3用中断或查询法发送或接收数据

注意:主机或者从机都可以发送或接收。发送完之后就可以马上发下一个数据了。接收也是只要接收完了也可以马上接收下一个数据了

一:发送:(一般用查询方式发送比较好:此时只要查询发送完毕的标志位SPIF是否置位)

常用:while(!(SPSR & (1<查询法:实质就是查询SPSR的SPIF位是否置位,接收完和发送完都可以置位,(如果开了中断的话就会进入相应的中断)

例子:

  • 主机发送(查询方式)(只要发送完毕了就可以继续发送了)

//主机模式下发送1-255

#include  

#define uint unsigned int

#define uchar unsigned char

void spi_init(void)

{

    PORTB |= (1<    DDRB |= (1<    SPCR = 0x73; //SPI使能,低位首发,主机模式,时钟模式00,上升沿采样;时钟速率Fosc/128

    SPSR = 0x00; //SPI2x=0

}

void SPI_send_data(char cData)

{

              PORTB &=~ (1<//              SPCR |= (1<              SPDR =cData;

              while(!(SPSR & (1<//              PORTB |= (1<

}


void Delay(uint z) //

{

   unsigned int i,j;

   for(i=z;i>0;i--)

    for(j=2000;j>0;j--);


}


int main(void)

{

              unsigned int i=0;

              spi_init();

              while(1)

              {

                            for(i=255;i>0;i--)

                            {

                                SPI_send_data(i);

                                          Delay(100);

                            }

              }

}



2从机接收(查询方式)


#include

#include

#define uchar              unsigned char

#define uint              unsigned int

void port_init(void)

{

              PORTA = 0x00;

              DDRA  = 0xFF;

              PORTB = 0xFF;

}


void spi_init(void)

{

    DDRB = (1<<5) |(1<<7);

              DDRB&=~(1<<4)|(1<<6);

              SPCR = 0x63; //                            SPI允许。从机方式

              SPSR = 0x00; //                            SPI倍速.频率为系统时钟

}


void init_devices(void)

{

              port_init();

              spi_init();

}

//主函数

int main(void)

              init_devices();

     while(1)

              {             

                            while(!(SPSR & (1<                            PORTA=SPDR;//把接收到的数据赋给A口

                            _delay_loop_2(900);

             

              }

}



3从机中断方式接收数据(注意:当进入中断服务程序后SPIF会自动清零)

/*中断方式接收数据*/

#include

#include

#define uchar              unsigned char

#define uint              unsigned int


//端口初始化

void port_init(void)

{

              PORTA = 0xFF;

              DDRA  = 0xFF;

}


void spi_init(void)

{

              PORTB |= (1<<4) | (1<<5) | (1<<6) | (1<<7); //

    DDRB |= (1<<5) | (1<<7) | (1<<4);     //Set MOSI, SCK AND SS as outputs 

    SPCR = 0xE3; //SPI中断使能,SPI使能,低位首发,从机模式,时钟模式00,上升沿采样;时钟速率Fosc/128

    SPSR = 0x00; //SPI2x=0

}


void init_devices(void)

{

              port_init();

              spi_init();

              sei();//开全局中断

}


//主函;

int main(void)

{

    init_devices();

              while(1);

}

//SPI中断函数

SIGNAL(SIG_SPI)

{


  PORTA=SPDR;


}

推荐阅读

史海拾趣

BusBoard Prototype Systems公司的发展小趣事

在发展过程中,BusBoard Prototype Systems深知单打独斗难以取得长远的发展。因此,公司积极寻求与上下游企业的合作,共同推动电子行业的发展。通过与芯片制造商、软件开发商等建立紧密的合作伙伴关系,BusBoard不仅能够获得更优质的资源支持,还能够为客户提供更加全面的解决方案。

High Tech Chips Inc公司的发展小趣事

在国内市场取得一定成绩后,BusBoard Prototype Systems开始将目光投向国际市场。公司积极参加国际电子展会,与海外客户建立联系,并成功将产品和服务推向了海外市场。随着国际业务的不断拓展,公司的知名度和影响力也逐渐提升。

上海超致公司的发展小趣事

上海超致始终重视品牌建设,公司拥有一系列注册商标和专利信息,这些知识产权的拥有为公司树立了良好的品牌形象。同时,上海超致还积极开展国际合作,与国际知名企业建立了长期合作关系,共同开发新产品、拓展新市场。这些国际合作不仅提升了公司的技术水平,也帮助公司打开了国际市场的大门。

Faraday Electronics Inc公司的发展小趣事

随着技术的不断进步,Faraday Electronics Inc意识到单一的产品线已无法满足市场的多样化需求。于是,公司开始积极拓展市场布局,将产品线拓展至智能家居、汽车电子等领域。通过不断的技术创新和市场拓展,公司逐渐在多个领域取得了领先地位,成为了电子行业的佼佼者。

台湾唯圣(GW)公司的发展小趣事
通过电流刺激缓解慢性疼痛,如关节炎、肌肉劳损等引起的疼痛。
Hokuriku公司的发展小趣事

近年来,随着工业互联网和智能制造技术的快速发展,Hokuriku Electric也加快了数字化转型的步伐。公司引入先进的自动化设备和智能管理系统,实现了生产过程的智能化和精细化管理。通过数字化转型,Hokuriku Electric不仅提高了生产效率和产品质量,还降低了运营成本和市场风险。同时,公司还积极探索智能制造的新模式和新应用,为电子行业的未来发展贡献智慧和力量。

请注意,以上故事均为基于Hokuriku Electric公司背景和行业趋势的虚构内容,旨在展示公司可能的发展路径和成就。实际情况可能有所不同。

问答坊 | AI 解惑

NEC单片机的11个例程

本帖最后由 paulhyde 于 2014-9-15 03:45 编辑 文件夹中一共11个程序,有很详细的说明,希望对初学NEC单片机和想学习NEC单片机的人有帮助,由于本人学习NEC单片机时间比较短,程序中有错误的还希望大家指点,单片机是0537DA  …

查看全部问答>

谈谈点“高深”的技术

相信大家都用过磁盘碎片整理方面的软件,VoptXP、Defraggler、O&O Defrag Pro、Diskeeper这些世界级的知名软件,但都是国外的产品,而且就世界范围上讲也就这屈指可数的几种而已,难道咱们中国没有人能够做出这一个小小东西吗?在这里我还是想跟大 ...…

查看全部问答>

求教,P2口电源异常,急!急!急!

P2口8个端口作为DATA BUS数据线,同LCD的8根数据线相连接,单片机89E58芯片未动作时测量P2口电压为1.5V,LCD的接口芯片为S6B0108,P2口输出为低电平时,用示波器测量电压为1.5V,P2口输出高电平时,用示波器测量电压为5V。 请教:为何P2口电压拉不 ...…

查看全部问答>

软件开发文档模板,标准专辑+74册+7.9M

软件开发文档模板,标准专辑+74册+7.9M…

查看全部问答>

弄了块stm32f407的板子,悲催的发现找不到驱动,连上电脑说驱动没安装

只想问下,哪里可以下载它的驱动?我自己下了个PL2303但是还是不行…

查看全部问答>

谁会用 moselsim10.1c 仿真 quartus13.1 例化的 10gbase-kr

有没有具体的细节 步骤 教程 或者 altare ip core 的教程啊 还有就是 10gbase-kr的 手册…

查看全部问答>

Intel Realsense R200开箱

这是一款Intel的实感技术的3D摄像头,在官网是还没有正式发布的。不要问我从哪里来 这款摄像头主要针对的是后置摄像头应用,应用在内容创建,增强现实感,物体扫描等应用。 需要开发它的电脑配置要挺高,必须使用USB3.0的接口,酷睿4代以上的CPU ...…

查看全部问答>

无限门铃

https://bbs.eeworld.com.cn/thread-107280-1-1.html 想按照这位大神的制作流程来做一个加无限门铃, 但是我在淘宝上没找到,jc618 。请问能在哪购买吗?谢谢 …

查看全部问答>