📄 isr_i2c.lst
字号:
C51 COMPILER V7.06 ISR_I2C 10/29/2006 14:34:14 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE ISR_I2C
OBJECT MODULE PLACED IN ISR_I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ISR_I2C.C LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <./Atmel/at89x52.h>
2 #include "source.h"
3 #define SDA_SET() (SDA=1)
4 #define SDA_CLR() (SDA=0)
5 //#define SDA_VAL() (PDDR &0x2)
6
7 #define SCL_SET() (SCL=1)
8 #define SCL_CLR() (SCL=0)
9
10
11 I2Cdesc I2c; //the device decriptor
12
13 extern void I2cFinish(I2Cdesc *I2C_pt);
14 unsigned int idata I2c_timer_cnt=0;
15 void Init_I2c_Timer(unsigned int us){//MCLK@18.432MHz
16 1 //(((MCLK/12))*(256-TH0))us
17 1 TH0=TIMER0H;//20us
18 1 TL0=TH0;
19 1 I2c_timer_cnt=us/20;
20 1 TR0=1; // let timer 0 run // TCON /
21 1 }
22 void Start_I2c_Timer(unsigned int us){
23 1 I2c_timer_cnt=us/20;
24 1 TL0=TH0;
25 1 TR0=1; // let timer 0 run // TCON /
26 1 }
27 void Stop_I2c_Timer(void){
28 1 TR0=0;
29 1 }
30 unsigned char SDA_VAL(void){
31 1 return SDA;
32 1 }
33 //*-----------------------------------------------------------------------------
34 //* 函数名称 : I2CWrite (I2Cdesc *I2C_pt, u_short loadAddress, u_char nbByte)
35 //* Object : I2C
36 //* 输入参数 : <I2C_pt> = 为I2C的描述指针,其结构定义在source.h中
37 //* : loadAddress 为I2C的输入的存储单元的地址
38 //* : nbByte 为要写入I2C的字节数
39 //* 输出变量 : 无
40 //* 功能 :把TxEnd中的数据的nbByte字节写到loadAddress地址
41 //*-----------------------------------------------------------------------------
42 void I2CWrite (I2Cdesc *I2C_pt, unsigned int loadAddress, unsigned int nbByte){
43 1 I2C_pt->state = NOK;
44 1 I2C_pt->operate=WRITE_BIT;
45 1 I2C_pt->Error=0;
46 1 //* initialize state
47 1 SCL_SET(); //* set SCL line
48 1 SDA_SET(); //* set SDA line
49 1
50 1 I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT ; //* get byte to transmit
51 1 I2C_pt->loadAddress = loadAddress; //* get address
52 1 I2C_pt->mode = HIGH_ADDRESS_WRITE; //* next mode
53 1 I2C_pt->nbI2CByte = nbByte; //* get number of byte to transmit
54 1 I2C_pt->countBit = 8; //* initialize countBit
55 1 I2C_pt->nb_ACK = 10; //* initialize nb_ACK
C51 COMPILER V7.06 ISR_I2C 10/29/2006 14:34:14 PAGE 2
56 1 //* change interrupt handler to I2CTxSendStartSDA
57 1 I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
58 1 //* Enable RC compare interrupt
59 1 Start_I2c_Timer(I2C_pt->Timer_Gap_us);//start Timer
60 1 }
61 //*-----------------------------------------------------------------------------
62 //* 函数名称 : I2CRead (I2Cdesc *I2C_pt, u_short loadAddress, u_char nbByte)
63 //* Object : I2C
64 //* 输入参数 : <I2C_pt> = 为I2C的描述指针,其结构定义在source.h中
65 //* : loadAddress 为I2C的输入的存储单元的地址
66 //* : nbByte 为要写入I2C的字节数
67 //* 输出变量 : 无
68 //* 功能 :从loadAddress地址中读nbByted放到RxEnd中
69 //*-----------------------------------------------------------------------------
70 void I2CRead (I2Cdesc *I2C_pt, unsigned int loadAddress, unsigned int nbByte){
71 1
72 1 I2C_pt->state = NOK; //* initialize state
73 1 I2C_pt->operate=READ_BIT;
74 1 I2C_pt->Error=0;
75 1
76 1 SCL_SET(); //* set SCL line
77 1 SDA_SET(); //* set SDA line
78 1
79 1 I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT ; //* get byte to read
80 1 I2C_pt->loadAddress = loadAddress; //* get address
81 1 I2C_pt->mode = HIGH_ADDRESS_READ; //* next mode
82 1 I2C_pt->nbI2CByte = nbByte; //* get nb byte to transmit
83 1
84 1 I2C_pt->countBit = 8; //* initialize countBit
85 1 I2C_pt->nb_ACK = 10; //* initialize nb_ACK
86 1 //* change interrupt handler to I2CTxSendStartSDA
87 1 I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
88 1 //* Enable RC compare interrupt
89 1 Start_I2c_Timer(I2C_pt->Timer_Gap_us);//start Timer
90 1 }
91
92 //*-----------------------------------------------------------------------------
93 //* 函数名称 : I2CDeviceRead (I2Cdesc *I2C_pt)
94 //* Object : I2C
95 //* 输入参数 : <I2C_pt> = 为I2C的描述指针,其结构定义在source.h中
96 //* 输出变量 : 无
97 //* 功能 :为在读字节操作时通知I2C设备,以下的操作为读操作
98 //*-----------------------------------------------------------------------------
99 void I2CDeviceRead (I2Cdesc *I2C_pt){
100 1 SDA_SET(); //* set SDA line
101 1 SCL_SET(); //* set SCL line
102 1
103 1 I2C_pt->I2CByte = I2C_pt->deviceAddress | READ_BIT; //* get byte to transmit
104 1 I2C_pt->mode = DATA_READ; //* next mode
105 1 I2C_pt->countBit = 8; //* initialize countBit
106 1 I2C_pt->nb_ACK = 10; //* initialize nb_ACK
107 1 //* change interrupt handler to I2CTxSendStartSDA
108 1 I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
109 1 }
110
111 //*-----------------------------------------------------------------------------
112 //* 函数名称 : I2CDeviceRead (I2Cdesc *I2C_pt)
113 //* Object : I2C
114 //* 输入参数 : <I2C_pt> = 为I2C的描述指针,其结构定义在source.h中
115 //* 输出变量 : 无
116 //* 功能 :为在写字节操作时通知I2C设备,以下的操作为写操作
117 //*-----------------------------------------------------------------------------
C51 COMPILER V7.06 ISR_I2C 10/29/2006 14:34:14 PAGE 3
118 void I2CDeviceWrite (I2Cdesc *I2C_pt){
119 1 SDA_SET();; //* set SDA line
120 1 SCL_SET();; //* set SCL line
121 1
122 1 I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT; //* get byte to transmit
123 1 I2C_pt->mode = DATA; //* next mode
124 1 I2C_pt->countBit = 8; //* initialize countBit
125 1 I2C_pt->nb_ACK = 10; //* initialize nb_ACK
126 1 //* change interrupt handler to I2CTxSendStartSDA
127 1 I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
128 1 }
129 //*-----------------------------------------------------------------------------
130 //* 函数名称 : I2CTxSendByte (I2Cdesc *I2C_pt)
131 //* Object : I2C
132 //* 输入参数 : <I2C_pt> = 为I2C的描述指针,其结构定义在source.h中
133 //* 输出变量 : 无
134 //* 功能 :为把状态字节,数据,地址等字节写到I2C设备中
135 //*-----------------------------------------------------------------------------
136 void I2CTxSendByte (I2Cdesc *I2C_pt){
137 1
138 1 SDA_SET();; //* set SDA line
139 1 switch(I2C_pt->mode){ //* get byte to transmit
140 2 case DATA : //Writing data byte now...
141 2 I2C_pt->I2CByte = *(I2C_pt->TxEnd++);
142 2 I2C_pt->nbI2CByte--;
143 2 if(I2C_pt->nbI2CByte == 0)
144 2 I2C_pt->mode = STOP; //* next mode
145 2 break;
146 2 case HIGH_ADDRESS_WRITE : //Write high byte of address (Write operation)...
147 2 I2C_pt->I2CByte = (unsigned char)(I2C_pt->loadAddress >> 8);
148 2 I2C_pt->mode = LOW_ADDRESS_WRITE; //* next mode
149 2 break;
150 2 case LOW_ADDRESS_WRITE : //Write low byte of address (Write operation)...
151 2 I2C_pt->I2CByte = (unsigned char) I2C_pt->loadAddress;
152 2 I2C_pt->mode = DATA; //* next mode
153 2 break;
154 2 case HIGH_ADDRESS_READ : //Write high byte of address (Read operation)...
155 2 I2C_pt->I2CByte = (unsigned char) (I2C_pt->loadAddress >> 8);
156 2 I2C_pt->mode = LOW_ADDRESS_READ; //* next mode
157 2 break;
158 2 case LOW_ADDRESS_READ : //Write low byte of address (Read operation)...
159 2 I2C_pt->I2CByte = (unsigned char) I2C_pt->loadAddress;
160 2 I2C_pt->mode = DEVICE_READ; //* next mode
161 2 break;
162 2 }
163 1 I2C_pt->countBit = 8; //* initialize countBit
164 1 I2C_pt->nb_ACK = 10; //* initialize nb_ACK
165 1 //* change interrupt handler to I2CTxSendBit
166 1 I2C_pt->I2CTCHandler = I2CTxSendBit;
167 1 }
168
169
170 //*-----------------------------------------------------------------------------
171 //* 函数名称 : I2CTxSendBit (I2Cdesc *I2C_pt)
172 //* Object : I2C
173 //* 输入参数 : <I2C_pt> = 为I2C的描述指针,其结构定义在source.h中
174 //* 输出变量 : 无
175 //* 功能 :根据发送数据的BIT位来判断要发送什么数据在SDA线上
176 //*-----------------------------------------------------------------------------
177 void I2CTxSendBit (I2Cdesc *I2C_pt){
178 1 unsigned char bit_val;
179 1 SCL_CLR(); //* Clear SCL line
C51 COMPILER V7.06 ISR_I2C 10/29/2006 14:34:14 PAGE 4
180 1 I2C_pt->countBit--; //* decrement countBit
181 1 if(I2C_pt->countBit >= 0){ //* if bit counter = 0 ...
182 2 bit_val = (I2C_pt->I2CByte >> I2C_pt->countBit) & 1; //* get bit to transfert
183 2 //* Send 0 or 1
184 2 if (bit_val){
185 3 SDA_SET(); //* Set SDA line
186 3 }
187 2 else{
188 3 SDA_CLR(); //* Clear SDA line
189 3 }
190 2 //* change interrupt handler to I2CTxSetSCL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -