历史上的今天
返回首页

历史上的今天

今天是:2024年11月27日(星期三)

正在发生

2019年11月27日 | 利用C51单片机模拟SPI进行双机通信

2019-11-27 来源:51hei

1.1SPI协议简述

SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。由Motorola首创。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线。

优缺点:

  • 1.协议简单,相对数据速率高。

  • 2.占用的Pin口较多

  • 3.没有指定的流控制,没有应答机制确认是否接收到数据。


SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI,SDO,SCK,CS。

  • SDO – 主设备数据输出,从设备数据输入

  • SDI – 主设备数据输入,从设备数据输出

  • SCK – 时钟信号,由主设备产生

  • CS – 从设备使能信号,由主设备控制



CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

SCK:SCK为时钟信号线,主要控制时序。相当于整个SPI协议是以SCK为准进行的。因此SCK的控制在每次发送中只能在主机的控制下进行,从机不可控制。

SDI/SDO: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。SDO为主机发送,从机接收;SDI为主机接受,从机发送。

参考网站(请自行替换.):dlnware点com/theory/SPI-Bus

1.2SPI的四种模式

这四种模式分别为:

模式                   CPOL&CPHA
MODE0          CPOL=0;CPHA=0
MODE1          CPOL=0;CPHA=1
MODE2          CPOL=1;CPHA=0
MODE3          CPOL=1;CPHA=1

参考网站(请自行替换.):dlnware点com/theory/SPI-Transfer-Modes

在这四种模式中,我们常用MODE0和MODE2。因为它便于操作。我便是使用的MODE2模式。这四种模式的区别在参考网站中有详细的描述,这里便不再赘述。

在MODE2模式下。时钟在空闲时始终置1,每产生一次下降沿便会发送1 bit 数据。大家可能已经想到,SPI协议可以在八位没有发出送完的情况下停止发送。

这里我跑了下示波器。
 
从图中清晰可见8个下降沿,时钟在空闲时始终置1。

其余的三个模式以此类推。


2.1软件模拟       

我使用的单片机为STC89C52,内部没有SPI的资源,因此需要自己进行软件模拟。


利用串口中断,首先利用电脑A得串口助手发送的数据存入SBUF,再将SBUF的值通过SPI的SDO发送给从机的SDI接收,并存入从机的SBUF,显示在电脑B的串口助手上。

目的:电脑A发送数据,如:AB,电脑B可接收到AB。

如图:
 

PS:在此项目中CS(片选)可以不用。


2.2代码

# include //头文件

# include //头文件


# define uchar unsigned char

# define uint unsigned int


sbit SCK = P1^0;//位定义时钟

//sbit CS = P1^1;//位定义片选(使能)  此项目可以不使用

sbit SDI = P1^2;//位定义Input

sbit SDO = P1^3;//位定义Output


/*-----函数声明-----*/

void delay5us();

void SpiSend(uchar dat1);

uchar SpiReceive();

void UARTInit();


/*-----主函数-----*/

void main()

{        

        UARTInit();

         while(1)

    {

                SBUF = SpiReceive();// 循环接收数据

    }

        ;//空语句        

}


/*-----5微秒延时函数-----*/

void delay5us()

{

        _nop_();

}


/*-----CPHA=0;CPOL=1 模式2-----*/

/*-----SPI发送函数-----*/

/*-----上升沿发送-----*/

void SpiSend(uchar dat1)

{

        uchar i;

        for (i=0; i<8; ++i)//8bit,一位一位写

        {

                SCK = 0;

                if (dat1 & 0x80)//判断当前最高位为1还是0

                {

                        SDO = 1;                

                }

                else

                {

                        SDO = 0;

                }

                SCK = 1;//上升沿发送数据

                dat1 <<= 1;

                delay5us();                

        }

}


/*-----SPI接收函数-----*/

/*-----下降沿接收-----*/

uchar SpiReceive()

{

        uchar i, dat0;

        dat0 = 0x00;//dat0初始化 

        for (i=0; i<8; ++i)//8bit,一位一位读

        {

                dat0<<=1;

        while(SCK == 1);    

        while(SCK == 0);//下降沿读取数据       

        dat0 |= SDI;         

        }

        return (dat0);//收到数据(返回值)dat0

}


/*-----串口(中断)初始化-----*/

void UARTInit()

{

        EA = 1;//开启总中断

        ES = 1;//打开串口中断

        SM0 = 0;SM1 = 1;//串口工作方式1,8位UART波特率可变

        REN = 1;//串口允许接收

        TR1 = 1;//启动定时器1

        TMOD |= 0X20;//定时器1,工作模式2 8位自动重装

        TH1 =0XFD;

        TL1 =0XFD;//设置波特率9600

}


/*-----串口中断服务函数-----*/

void UART() interrupt 4

{

        if (RI)//判断是否接收完成

        {

                RI = 0;//软件清零

                SpiSend(SBUF);// 转发接收到的数据

        }

        if (TI)//判断是否发送完成

        {

                TI = 0;//软件清零

        }                

}


PS:SDI和SDO需交叉连接。


3.总结

在发送数据时,时钟仅由发送端(主机)控制;

SPI四种模式,只需将主从机同步一种模式即可;

SCK,SDI,SDO,CS四个引脚由自己定义即可。

推荐阅读

史海拾趣

安纳森(AnaSem)公司的发展小趣事

随着公司知名度的提升,安纳森也不可避免地遭遇了一些侵权问题。面对不法公司或机关声称其为安纳森半导体本身或正式授权单位的情况,安纳森迅速采取行动,通过法律手段维护自身的合法权益。同时,公司还加强了与用户的沟通和交流,及时澄清误会,确保用户能够购买到真正的安纳森产品。这一系列的应对措施不仅有效地维护了安纳森的品牌形象,也为其在市场中树立了良好的口碑。

API Technologies公司的发展小趣事

随着全球电子市场的不断扩大,API Technologies开始实施全球化战略布局。公司先后在多个国家和地区设立了分支机构和研发中心,积极开拓国际市场。通过与全球客户的紧密合作,API Technologies的产品和技术逐渐在全球范围内得到了广泛应用和认可。

Alorium Technology公司的发展小趣事

作为一家有社会责任感的企业,API Technologies不仅关注经济效益,也积极履行社会责任。公司注重环保和可持续发展,在生产过程中采取了一系列环保措施,降低能耗和排放。同时,公司还积极参与社会公益活动,回馈社会,为社区的繁荣和发展做出了贡献。

这些故事展示了API Technologies在电子行业中的发展历程和取得的成就。通过不断创新、全球化布局、品质管理和履行社会责任,公司逐渐成为了电子行业的佼佼者。

Deutron Electronics Corp公司的发展小趣事

Deutron Electronics Corp深知研发和创新对于公司发展的重要性。因此,公司始终保持着对研发的高投入,不断引进和培养人才。公司建立了完善的研发体系,鼓励员工参与创新活动,并为他们提供了充足的资源和支持。这些措施使得Deutron Electronics Corp在研发方面取得了显著成果,为公司的发展提供了源源不断的动力。

Conflux公司的发展小趣事

随着公司业务的不断发展,Conflux开始寻求与其他电子行业企业的合作。通过与智能手机制造商的合作,Conflux成功将其区块链技术集成到了手机支付应用中,为用户提供了更加便捷、安全的支付体验。此外,Conflux还与多家电商平台达成战略合作,利用区块链技术优化交易流程,提高交易透明度。这些合作不仅拓展了Conflux的市场份额,也进一步提升了其在电子行业的影响力。

Bellin公司的发展小趣事

Conflux深知人才是企业发展的核心动力。因此,公司一直注重人才培养和引进。通过与高校和研究机构的合作,Conflux吸引了大量优秀的科研人才加入公司。同时,公司还建立了完善的培训体系,不断提升员工的技能和素质。这些措施为公司的持续创新和发展提供了坚实的人才保障,也构筑了公司的核心竞争力。

问答坊 | AI 解惑

AVR基本硬件线路设计与分析

基本的AVR硬件线路,包括以下几部分: 1。复位线路 2。晶振线路 3。AD转换滤波线路 4。ISP下载接口 5。JTAG仿真接口 6。电源 复位线路的设计 Mega16已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位 ...…

查看全部问答>

IGBT驱动芯片IXDN404应用及改进

摘要:介绍了IXYS公司大功率IGBT驱动芯片IXDN404的特点及性能,并在此基础上,根据IGBT驱动的实际要求,设计出了一种具有过流保护及慢关断功能的简单有效的驱动电路,给出了实际电路图和驱动波形。    关键词:IGBT;驱动与保护;IXDN404 ...…

查看全部问答>

我现在要做个温度无线采集系统

要求:1,采集温度 通过gprs模块上传到计算机            2,需要自己做出板子            3.,需要编写单片机程序    & ...…

查看全部问答>

vs2005模拟器调用webservice问题

在vs2005下创建一个wince设备应用程序时候,要调用之前创建的一个webservice,地址是http://localhost/WebService1/Service1.asmx,那个localhost应该怎么改啊?各位大虾们救急啊!!万分感谢…

查看全部问答>

求助:winCE5.0点开控制面板,系统马上就报错,停止响应!

我用的系统是winCE5.0,每当我点开控制面板,系统就会报错,并且停止响应。错误如下: Data Abort: Thread=8bb44664 Proc=89df63b0 \'gwes.exe\' AKY=00000049 PC=03fc4860(coredll.dll+0x00054860) RA=45084508(???+0x45084508) BVA=0a079c00 FSR ...…

查看全部问答>

232转485的电路,电路一通电就一直不停的收到00,怎么回事?

232转485的电路,电路一通电就一直不停的收到00,怎么回事? 我的接法如图, 把485芯片的A,B,挂到总线上去。 总线上接有120欧姆匹配电阻(首,尾都有,共两个)。 PC上串口调试程序不停的收到00(是16进制的),有时也有别的。 即使我把89C5 ...…

查看全部问答>

2602型源表进行VCSEL直流生产测试过程

开始扫描 开始扫描时,所有设备的输出端接通打开。一旦温度稳定,外部程序即可调用LIV_Test()函数,通过向2602设备发送如下字符串实现: send(kth2602,”LIV_Test()”,status)   读取线程缓冲区 ‘query trace buffers send(kth2500, “ ...…

查看全部问答>

多相级联结构设计倍频程滤波器的问题

大家好, 我是新手,在了解了论坛规则后尝试寻找解决方法无果后在此发帖,希望有人帮忙指点下,谢谢。 我的专业是数字信号和图像处理,目前我在用c++实现倍频程滤波器,采用的是多相级联结构。如图:这是一个4阶倍频程的例子。H0是低通FIR滤波器 ...…

查看全部问答>

电容器的检测方法与经验

1 固定电容器的检测   A 检测10pF以下的小电容 因10pF以下的固定电容器容量太小,用万用表进行测量,只能定性的检查其是否有漏电,内部短路或击穿现象。测量时,可选用万用表R×10k挡,用两表笔分别任意接电容的两个引脚,阻值应为无穷 ...…

查看全部问答>

TI M3停产怎么办!!

公司现在有些产品还在用LM3S6911 、LM3S811、LM3S9B92,LM3S9B96(做PTP),停产后供货还能持续多久?? M4又不支持以太网,以后怎么办??~~~    M3下的这么彻底,TI您好歹给我们留条后路啊!! [ 本帖最后由 yanhy 于 2012-12-13 15:49 ...…

查看全部问答>