📄 io3.lst
字号:
C51 COMPILER V7.50 IO3 02/16/2009 09:18:45 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE IO3
OBJECT MODULE PLACED IN D:\VW\INTEGR~1\MAIN\IO3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE D:\VW\INTEGR~1\MAIN\IO3.C DB SB OE
line level source
1 /*
2 +---------------------------------------------------+
3 | Project: SYSTEM with STC89C5X |
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: STC89C5X |
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 V7.50 IO3 02/16/2009 09:18:45 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 函数名称:getbytespi()
86 功能描述:接收一个字节数据子程序
87 参 数:udata
88 调用之前最好检测MCLK是否为0(对方是否申请数据通讯)再进入,否则里面是死等此信号!
89 ***********************************************************************************/
90 UINT8 UDAT;
91 bit getbytespi()
92 {
93 1 UINT8 i;
94 1 UINT16 n;
95 1 UDAT = 0;
96 1
97 1 n = 0;
98 1 while (MCLK) //检测主机开始
99 1 {
100 2 n++;
101 2 if (n > 15000) //1000:4mS;2000:8mS;3000:12mS;5000:20mS;10000:40mS;
102 2 { //20000:80mS;30000:120mS;40000:600mS;60000:800mS;
103 3 return(1);
104 3 }
105 2 }
106 1 SCLK = 0; //接受通讯请求
107 1
108 1 for (i=4;i!=0;i--)
109 1 {
110 2 UDAT = UDAT << 1; //准备收下一个bit
111 2 n = 0;
112 2 while (!MCLK) //检测主机放数据
113 2 {
114 3 n++;
115 3 if (n > 10000)
116 3 {
117 4 MCLK = 1;
C51 COMPILER V7.50 IO3 02/16/2009 09:18:45 PAGE 3
118 4 return(1);
119 4 }
120 3 }
121 2 if (SDA)
122 2 UDAT |= 1; //收一个bit
123 2 SCLK = 1;
124 2
125 2 UDAT = UDAT << 1; //准备收下一个bit
126 2 n = 0;
127 2 while (MCLK) //检测主机放数据
128 2 {
129 3 n++;
130 3 if (n > 10000)
131 3 {
132 4 MCLK = 1;
133 4 return(1);
134 4 }
135 3 }
136 2 if (SDA)
137 2 UDAT |= 1; //收一个bit
138 2 SCLK = 0;
139 2 }
140 1 n = 0;
141 1 while (!MCLK) //检测主机发完
142 1 {
143 2 n++;
144 2 if (n > 10000)
145 2 {
146 3 MCLK = 1;
147 3 return(1);
148 3 }
149 2 }
150 1 SCLK = 1;
151 1 return(0);
152 1 }
153 /***********************************************************************************
154 函数名称:getspi()
155 功能描述:接收N个字节数据子程序
156 参 数:*buf,n
157 调用之前最好检测MCLK是否为0(对方是否申请数据通讯)再进入,否则里面是死等此信号!
158 ***********************************************************************************/
159 bit getspi(UINT8 *buf,UINT8 n)
160 {
161 1 while(n)
162 1 {
163 2 if(getbytespi())
164 2 {
165 3 return(1);
166 3 }
167 2 *buf = UDAT;
168 2 buf++;
169 2 n--;
170 2 }
171 1 return(0);
172 1 }
C51 COMPILER V7.50 IO3 02/16/2009 09:18:45 PAGE 4
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
P1 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0090H 1
P2 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A0H 1
P3 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B0H 1
XICON. . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00C0H 1
P4 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00E8H 1
IE . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A8H 1
size_t . . . . . . . . . . . . . . . . TYPEDEF ----- U_INT ----- 2
festa. . . . . . . . . . . . . . . . . TYPEDEF ----- UNION ----- 2
whole. . . . . . . . . . . . . . . . MEMBER ----- ARRAY 0000H 2
holiday. . . . . . . . . . . . . . . MEMBER ----- ARRAY 0000H 2
IP . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B8H 1
MCLK . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0092H 1
UINT16 . . . . . . . . . . . . . . . . TYPEDEF ----- U_INT ----- 2
bool . . . . . . . . . . . . . . . . . TYPEDEF ----- BIT ----- 1
SCLK . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0090H 1
UDAT . . . . . . . . . . . . . . . . . PUBLIC DATA U_CHAR 0000H 1
SCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0098H 1
TCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0088H 1
user . . . . . . . . . . . . . . . . . TYPEDEF ----- UNION ----- 16
whole. . . . . . . . . . . . . . . . MEMBER ----- ARRAY 0000H 16
class. . . . . . . . . . . . . . . . MEMBER ----- STRUCT 0000H 16
getbytespi . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
i. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
n. . . . . . . . . . . . . . . . . . * REG * DATA U_INT 0006H 2
SDA. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0091H 1
T2CON. . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00C8H 1
ULONG32. . . . . . . . . . . . . . . . TYPEDEF ----- U_LONG ----- 4
_getspi. . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
buf. . . . . . . . . . . . . . . . . * REG * DATA PTR 0001H 3
n. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0004H 1
UINT8. . . . . . . . . . . . . . . . . TYPEDEF ----- U_CHAR ----- 1
PSW. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00D0H 1
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 158 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -