📄 i2c.lst
字号:
C51 COMPILER V8.08 I2C 03/02/2009 10:49:10 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\Output-files\I2C.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C-files\I2C.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\List-files\I2C.lst)
- OBJECT(.\Output-files\I2C.obj)
line level source
1 #include "..\ucos-ii\includes.h"
2
3
4 //static OS_EVENT *I2cMbox;
5
6 INT8U COMMAND; // 在SMBus中断服务程序中用于保存从地址 + R/W 位。
7
8 INT8U IIC_dat; // 保持SMBus要发送的数据字节或刚收到的数据
9
10 INT8U BYTE_NUMBER; // 在中用于检查发送的是什么数据
11 // 高地址字节、低地址字节或数据字节
12 INT8U HIGH_ADD, LOW_ADD; // EEPROM存储器地址的高、低字节
13
14 INT8U SM_BUSY=0; // 该位在发送或接收开始时被置1,
15 // 操作结束后由中断服务程序清0
16
17
18
19 INT8U I2cInit(void) reentrant
20 {
21 1 SFRPAGE=SMB0_PAGE;
22 1
23 1 SMB0CN = 0x44; // 允许SMBus在应答周期发送ACK 没有用到超时检查。
24 1 //SMB0CR = 0x99; //SMBUS 波特率设置:100KHz
25 1
26 1 // SMB0CR = 0xC4; //SMBUS 波特率设置:50KHz
27 1 SMB0CR = 0x2B;
28 1
29 1 EIE1 |= 0x02; //开启SMBUS中断
30 1
31 1 /*
32 1 I2cMbox = OSMboxCreate((void *)0); //消息邮箱用于中断向任务传递操作结果
33 1 if (I2cMbox ==(void *)0 )
34 1 return FALSE;
35 1 */
36 1
37 1 return FALSE;
38 1
39 1 }
40
41 /***********************************************************************
42 // SMBus 字节写函数-----------------------------------------------------
43 // 向给定存储器地址写一个字节
44 //
45 // out_byte = 待写数据
46 // byte_address = 待写存储器地址(2字节)
47 // chip_select = 待写EEPROM芯片的器件地址
48
49 *************************************************************************/
50
51 void SM_Send (INT8U chip_select, INT16U byte_address,INT8U len, INT8U out_byte) reentrant
52 {
53 1
54 1 while (SM_BUSY); // 等待SMBus空闲
C51 COMPILER V8.08 I2C 03/02/2009 10:49:10 PAGE 2
55 1
56 1 SM_BUSY = 1; // 占用SMBus(设置为忙)
57 1
58 1 SFRPAGE=SMB0_PAGE;
59 1
60 1
61 1 SMB0CN = 0x44; // SMBus允许,应答周期发ACK
62 1
63 1 COMMAND = (chip_select | WRITE); // 片选 + WRITE
64 1 //(上) 在SMBus中断服务程序中用于保存从地址 + R/W 位。
65 1
66 1
67 1 if(len) //2个字节
68 1 {
69 2 BYTE_NUMBER = 2; // 2地址字节
70 2
71 2 }
72 1 else
73 1 {
74 2 BYTE_NUMBER = 1; // 1地址字节
75 2
76 2
77 2 }
78 1 HIGH_ADD =(INT8U)byte_address;
79 1 LOW_ADD = (INT8U)byte_address;
80 1 IIC_dat = out_byte; // 待写数据
81 1 // 保持SMBus要发送的数据字节或刚收到的数据
82 1
83 1
84 1 SFRPAGE=SMB0_PAGE;
85 1 STA = 1; // 启动传输过程
86 1 while (SM_BUSY); // 等待传输结束
87 1
88 1
89 1 }
90
91
92
93
94 /***********************************************************************
95 // SMBus随机读函数-----------------------------------------------------
96 // 从给定存储器地址读一个字节
97 //
98 // byte_address = 要读取的存储器地址
99 // chip_select = 待读EEPROM的器件地址
100 //len从器件地址字节。
101 ************************************************************************/
102 INT8U SM_Receive (INT8U chip_select, INT16U byte_address,INT8U len) reentrant
103 {
104 1
105 1 while (SM_BUSY); // 等待总线空闲
106 1 SM_BUSY = 1; //占用SMBus(设置为忙)
107 1
108 1 SFRPAGE=SMB0_PAGE;
109 1
110 1 SMB0CN = 0x44; // 允许SMBus,应答周期发ACK
111 1
112 1 COMMAND = (chip_select | READ); // 片选 + READ
113 1
114 1 if(len)//2个字节
115 1 {
116 2 BYTE_NUMBER = 2; // 2地址字节
C51 COMPILER V8.08 I2C 03/02/2009 10:49:10 PAGE 3
117 2 HIGH_ADD = ((byte_address >> 8) & 0x00FF); // 高8位地址
118 2 //LOW_ADD = (byte_address & 0x00FF); // 低8位地址
119 2
120 2 }
121 1
122 1 else
123 1 {
124 2 BYTE_NUMBER = 1; // 1地址字节
125 2 HIGH_ADD =(INT8U)byte_address; // 高8位地址
126 2 }
127 1
128 1 LOW_ADD = (INT8U)byte_address ; // 低8位地址
129 1
130 1 SFRPAGE=SMB0_PAGE;
131 1 STA = 1; // 启动传输过程
132 1
133 1 while (SM_BUSY); // 等待传输结束
134 1
135 1 return IIC_dat;
136 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -