0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

双CPU通过普通IO口通信3线双向零等待通信的详细概述

Wildesbeast 来源:福星电子网 作者:佚名 2019-11-09 11:08 次阅读

3线双向零等待IO通讯机制

许多设备需要通过IO通讯交互数据,怎样才做到速度最快,通讯可靠,所用资源又少呢?

下面介绍一个我编写的通讯协议:

它没有1线,2线那样节省IO资源,但是它的通讯速度绝对最快,无需延时,且不用中断,还可以

对等传输。

实际情况下C51编写,实现了50us传输一个字节,折合160Kbps左右,晶振22M。

特点如下:

使用3根普通IO通讯

不使用中断

双方都可以主动发起数据通讯,也都可以被动接收数据,即可以对等传输。

有发送和接收的检查等待机制,发送方知道对方什么时候收了数据,接收方知道发送方什么时

候发了数据。

无需进行数据延时,最大可能地加快了通讯速度。

CPU闲的时候通讯速率可以最快。忙的时候又可以无限等待。保证绝对同步,不会出错。

双方CPU工作速度可以任意,即使是51和P4通讯,也能保证正确无误。

ask w1 w2 w3 w4 w5 w6 w7 w8

MCLK ┐┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌───

└┘ └──┘ └──┘ └──┘ └──┘

SDT ___┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐________

└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘

SCLK ┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌─

└─┘ └──┘ └──┘ └──┘ └──┘

res r1 r2 r3 r4 r5 r6 r7 r8

1.主机发起通讯申请到从机

主机检测MCLK是否为0,为0的话是对方在申请通讯,退出函数。

主机检测到MCLK=1,表示通讯空闲。

主机将MCLK=0,表示申请通讯。 之后检测SCLK是否为0(是否响应通讯)

2.从机响应通讯,从机在闲时检测MCLK是否为0,发现为0则主机向它发起了通讯申请。

从机将SCLK=0,表示接受申请,之后检测MCLK是否变为1,如果是1则主机已经发出了第一个bit

的数据。

3.主机发现SCLK=0,知道从机已经开始准备接受数据。

4.主机发送第一个bit到SDA.

5.主机将MCLK=1,表示已经发送第一个bit到SDA.

6.从机发现MCLK=1,知道主机已经发出第一个数据

7.从机收第一个bit的数据。

8.从机将SCLK=1,表示已经收了第一个bit.之后等待MCLK是否变0,如果变0,则主机已经发出

了第二个bit

9.主机发现SCLK=1,知道从机已经开始准备接受第二个数据。

10.主机发送第二个bit到SDA.

11.主机将MCLK=0,表示已经发送第二个bit到SDA.

12.从机发现MCLK=0,知道主机已经发出第二个数据

13.从机收第二个bit的数据。

14.从机将SCLK=0,表示已经收了第二个bit.之后等待MCLK是否变1,如果变1,则主机已经发出

了第三个bit

15.再重复3-14,3遍,传完8bit数据。

16.主机发现SCLK=0,知道从机已经收完8位数据

17.主机将MCLK=1,准备下一轮通讯

18.从机发现MCLK=1,知道主机已经收起MCLK

19.从机将SCLK=1,准备下一轮通讯

附源代码:

sbit MCLK=P3^5;

sbit SCLK=P3^6;

sbit SDA=P3^7;

uchar bdata DATA;

sbit BIT0=DATA^0;

sbit BIT7=DATA^7;

// 发送一个数据

putbytespi(uchar ch)

{

uchar i;

uint c;

if(!MCLK)return; //

MCLK=0; //申请通讯

DATA=ch;

for(i=4;i!=0;i--)

{

while(SCLK); //检测从机响应

SDA=BIT0; //放一个bit到SDA

MCLK=1;

DATA=DATA》》1; //准备下一个bit

while(!SCLK); //检测从机响应

SDA=BIT0; //放一个bit到SDA

MCLK=0;

DATA=DATA》》1; //准备下一个bit

}

while(SCLK); //检测从机收完

MCLK=1;

while(!SCLK);//等待从机准备好

SDA=1;

}

//接收一个数据

//调用之前最好检测MCLK是否为0(对方是否申请数据通讯)再进入,否则里面是死等此信

号!

uchar getbytespi()

{

uchar i;

while(MCLK);

SCLK=0; //接受通讯请求

for(i=4;i!=0;i--)

{

DATA=DATA》》1; //准备收下一个bit

while(!MCLK); //检测主机放数据

BIT7=SDA;//收一个bit

SCLK=1;

DATA=DATA》》1; //准备收下一个bit

while(MCLK); //检测主机放数据

BIT7=SDA; //收一个bit

SCLK=0;

}

while(!MCLK); //检测主机发完

SCLK=1;

return(DATA);

}

责任编辑 LK

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IO
    IO
    +关注

    关注

    0

    文章

    396

    浏览量

    38508
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10437

    浏览量

    206527
  • 通信
    +关注

    关注

    18

    文章

    5703

    浏览量

    134374
收藏 人收藏

    评论

    相关推荐

    基于RAH的LonWOrks智能通信节点设计

    介绍一种基于RAM的L0NW0rkS现场总线智能通信节点的设计方法,并给出详细的设计步骤、硬件及软件实现。通过此LonWorkS智能
    发表于 03-08 17:25

    IO单线通信

    用STM8S的IO单线通信时,接收的IO怎么接收,也就是怎么知道何时接收?新手学习
    发表于 08-29 15:58

    请问有关于STM32普通IO模拟操作SMBus通信的相关实践经验吗?

    求助啊,哪位有关于STM32普通IO模拟操作SMBus通信的相关实践经验?分享下,多谢。普通IO
    发表于 10-22 08:43

    AT32F403A 224K RAM 和非等待区关系详解

    等待区(ZW)使用,96K划给用户使用作为RAM使用256K的非等待区里可以通过软件配置将其中的128K划出来给用户作为RAM使用,那么此时用户就有96+128K RAM可以使用,这
    发表于 11-20 21:25

    普通串口通信的相关资料分享

    普通串口通信我程序中的通信采用的是中断接收单字节,在主函数里面用一个函数来进行数据处理,比如校验操作。其实单片机的通信大致都是,时钟配置
    发表于 01-14 06:55

    利用STM32单片机普通IO模拟串口通信

    前段时间利用STM32单片机普通IO模拟串口通信控制TM1652让数码管显示。目前没出现什么问题点,此贴仅贴出核心模拟串口通信部分,如有需
    发表于 01-18 07:42

    普通IO做模拟通信设计的方法

    给从机的目的。(因没有使用到从机给主机发数据,所以没有设计)二、使用过程设计在比较熟悉Iic、Spi通信协议,了解时钟、数据线之后,便可以尝试使用
    发表于 02-09 06:50

    怎样通过IO端口模拟实现单片机与从设备的SPI通信

    IO模拟SPI根据SPI通信规范,与IO模拟I2C类似,通过
    发表于 02-17 07:19

    stm32单片机准双向IO配置介绍

    我们在开始学习51内核的单片机的时候就知道,p0的引脚都是双向IO,P1,P2,P3IO
    发表于 02-21 07:00

    CH32V307等待区和非等待区的区别是什么?

    and non-0waiting areas),分为了等待区和非等待区,那么请问:1、这个非等待
    发表于 05-13 06:52

    如何提升非等待区Flash效能

    部分 AT32 带有非等待区,当代码超过等待区后,且时钟不高于 72MHz,读取Flash 的效能会降低。此时不改变外围时钟,如何快速修改程序以提高 Flash 效能?
    发表于 10-20 08:26

    闪存等待(ZW)和非等待(NZW)说明

    闪存等待区(ZW)和非等待区(NZW)有何区别?请说明。
    发表于 10-20 07:01

    擦除FLASH等待区期间需注意事项

    擦除FLASH等待区期间需注意事项有等待区的MCU 系列,在擦除等待区时需注意事项?
    发表于 10-23 07:36

    如何利用AT32系列MCU存储器中的等待区(ZW)

    本应用笔记详细描述了如何利用AT32系列MCU存储器中的等待区(ZW),实现在擦除或者编程过程中保证CPU重要内容正常运行,免受MCU失速影响。
    发表于 10-24 08:17

    怎样使用普通IO模拟串口?

    普通IO如何模拟串口通信
    发表于 11-10 07:33