📄 io3.lst
字号:
C51 COMPILER V6.23a IO3 02/04/2009 09:04:09 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE IO3
OBJECT MODULE PLACED IN D:\VW\INTEGR~1\HEAD\IO3.OBJ
COMPILER INVOKED BY: C:\comp51\C51.EXE D:\VW\INTEGR~1\HEAD\IO3.C DB SB OE
stmt level source
1 /*
2 +---------------------------------------------------+
3 | Project: SYSTEM with STC12CX052 |
4 | File: IO3.C |
5 | Data: 2008-12-02 |
6 | Version: V 1.0 |
7 | Initial Editor: Li Jifeng |
8 +---------------------------------------------------+
9 | following environments are supported |
10 | Processor: STC12CX052 |
11 | Compiler: WAVE V |
12 | hardware: JF-2008 |
13 +---------------------------------------------------+
14 | Copyright (C) JF Ltd, 2008 |
15 | All Rights reserved |
16 +---------------------------------------------------+
17 | 功能简介: the IO3 function |
18 +---------------------------------------------------+
19 */
20 /*
21 双CPU,普通I/O,3线通信
22
23 3线双向零等待IO通讯机制
24
25 许多设备需要通过IO通讯交互数据,怎样才做到速度最快,通讯可靠,所用资源又少呢?
26 下面介绍一个我编写的通讯协议:
27 它没有1线,2线那样节省IO资源,但是它的通讯速度绝对最快,无需延时,且不用中断,还可以对等传输.
28 实际情况下C51编写,实现了50us传输一个字节,折合160Kbps左右,晶振22M。
29
30 特点如下:
31 使用3根普通IO通讯
32 不使用中断
33 双方都可以主动发起数据通讯,也都可以被动接收数据,即可以对等传输.
34 有发送和接收的检查等待机制,发送方知道对方什么时候收了数据,接收方知道发送方什么时候发了数据.
35 无需进行数据延时,最大可能地加快了通讯速度.
36 CPU闲的时候通讯速率可以最快.忙的时候又可以无限等待.保证绝对同步,不会出错.
37 双方CPU工作速度可以任意,即使是51和P4通讯,也能保证正确无误.
38
39 ask w1 w2 w3 w4 w5 w6 w7 w8
40 MCLK ┐┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌───
41 └┘ └──┘ └──┘ └──┘ └──┘
42
43 SDT ___┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐________
44 └─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘
45
46 SCLK ┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌─
47 └─┘ └──┘ └──┘ └──┘ └──┘
48 res r1 r2 r3 r4 r5 r6 r7 r8
49
50 1.主机发起通讯申请到从机
51 主机检测MCLK是否为0,为0的话是对方在申请通讯,退出函数.
52 主机检测到MCLK=1,表示通讯空闲.
53 主机将MCLK=0,表示申请通讯. 之后检测SCLK是否为0(是否响应通讯)
54
55 2.从机响应通讯,从机在闲时检测MCLK是否为0,发现为0则主机向它发起了通讯申请.
C51 COMPILER V6.23a IO3 02/04/2009 09:04:09 PAGE 2
56 从机将SCLK=0,表示接受申请,之后检测MCLK是否变为1,如果是1则主机已经发出了第一个bit的数据.
57
58 3.主机发现SCLK=0,知道从机已经开始准备接受数据.
59 4.主机发送第一个bit到SDA.
60 5.主机将MCLK=1,表示已经发送第一个bit到SDA.
61
62 6.从机发现MCLK=1,知道主机已经发出第一个数据
63 7.从机收第一个bit的数据.
64 8.从机将SCLK=1,表示已经收了第一个bit.之后等待MCLK是否变0,如果变0,则主机已经发出了第二个bit
65
66 9.主机发现SCLK=1,知道从机已经开始准备接受第二个数据.
67 10.主机发送第二个bit到SDA.
68 11.主机将MCLK=0,表示已经发送第二个bit到SDA.
69
70 12.从机发现MCLK=0,知道主机已经发出第二个数据
71 13.从机收第二个bit的数据.
72 14.从机将SCLK=0,表示已经收了第二个bit.之后等待MCLK是否变1,如果变1,则主机已经发出了第三个bit
73
74 15.再重复3-14,3遍,传完8bit数据.
75
76 16.主机发现SCLK=0,知道从机已经收完8位数据
77 17.主机将MCLK=1,准备下一轮通讯
78
79 18.从机发现MCLK=1,知道主机已经收起MCLK
80 19.从机将SCLK=1,准备下一轮通讯
81 */
82 #include "system.h"
83
84 /***********************************************************************************
85 函数名称:putbytespi()
86 功能描述:发送一个字节数据子程序
87 参 数:udata
88 调用之前最好检测MCLK是否为0(对方是否申请数据通讯)
89 ***********************************************************************************/
90 bit putbytespi(UINT8 udata)
91 {
92 1 UINT8 i;
93 1 UINT16 n;
94 1
95 1 if (!MCLK)
96 1 return(1);
97 1 MCLK = 0; //申请通讯
98 1
99 1 //WDT_CONTR = 0x3C; //喂狗
100 1 for (i=4;i!=0;i--)
101 1 {
102 2 n = 0;
103 2 while (SCLK) //检测从机响应
104 2 {
105 3 n++;
106 3 if (n > 10000) //1000:4mS;2000:8mS;3000:12mS;5000:20mS;10000:40mS;
107 3 { //2000:80mS;30000:120mS;40000:600mS;60000:800mS;
108 4 MCLK = 1;
109 4 return(1);
110 4 }
111 3 }
112 2 if (udata & 0x80)
113 2 SDA = 1; //放一个bit到SDA0
114 2 else SDA = 0;
115 2 MCLK = 1;
116 2 udata = udata << 1; //准备下一个bit
117 2
C51 COMPILER V6.23a IO3 02/04/2009 09:04:09 PAGE 3
118 2 //WDT_CONTR = 0x3C; //喂狗
119 2 n = 0;
120 2 while (!SCLK) //检测从机响应
121 2 {
122 3 n++;
123 3 if (n > 10000)
124 3 {
125 4 MCLK = 1;
126 4 return(1);
127 4 }
128 3 }
129 2 if (udata & 0x80)
130 2 SDA = 1; //放一个bit到SDA0
131 2 else SDA = 0;
132 2 MCLK = 0;
133 2 udata = udata << 1; //准备下一个bit
134 2 }
135 1 n = 0;
136 1 while (SCLK) //检测从机收完
137 1 {
138 2 n++;
139 2 if (n > 10000)
140 2 {
141 3 MCLK = 1;
142 3 return(1);
143 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -