📄 hi2csla_c51.lst
字号:
C51 COMPILER V7.07 HI2CSLA_C51 11/18/2005 14:52:01 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE HI2CSLA_C51
OBJECT MODULE PLACED IN HI2CSLA_C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE HI2CSLA_C51.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************************************
2 * 从方式的LPC932硬件I2C
3 * 1 使用I2C总线软件包时P1.2,P1.3切勿写为0,并要设置为开漏输出。
4 * 2 总线定义为P1.2=SCL,P1.3=SDA,需外接上拉电阻2-10k。
5 * 3 相应寄存器:
6 * 地址寄存器 I2ADR 用于存放自身从地址(从方式时才有用)
7 * 数据寄存器 I2DAT 接收/发送数据用
8 * 控制寄存器 I2CON 用于硬件I2C的设置、使能、启动、结束,
9 * 应答控制,中断标志等。
10 * 状态寄存器 I2STAT 指示I2C总线的操作状态码,高5位有效,
11 * 若I2C中断志置位,可查询此寄存器判断
12 * 总线情况。
13 * SCL占空比寄存器 I2SCLH、I2SCLL 设置SCL的频率发生。
14 * 设置最好与主机的SCL频率基本一至。
15 * 使用:使用前要先开中断:总中断EA和I2C中断允许EI2C,其中断入口地址为33H;
16 * 在中断里进行接收或发送数据操作,调用操作如下:
17 * 若是从接收,则循环调用RcvByte接收字节数据,直至总线结束/重启;
18 * 若是从发送,则循环调用SendByte发送数据,直至接收到非应答信号;
19 * 为了防止从器件因总线出错而死机,可用定时器实现超时处理。
20 *****************************************************************/
21 #include "./include/datatypes.h"
22
23 #define GENERATE_STOP 0x54 /* 置位 STO, 复位 STA 、 SI */
24 #define RELEASE_BUS_ACK 0x44 /* 复位 STO,STA,SI 并置位 AA (ack) */
25 #define RELEASE_BUS_NOACK 0x40 /* 复位 STO,STA,SI 并置位 AA (noack) */
26 #define RELEASE_BUS_STA 0x64 /* 起动总线/重新起动总线, 置位 STA */
27
28 /* 定义LPC932的I2C相关寄存器的定义 */
29 sfr I2ADR = 0xDB;
30 sfr I2DAT = 0xDA;
31 sfr I2CON = 0xD8;
32 sfr I2STAT = 0xD9;
33 sfr I2SCLH = 0xDD;
34 sfr I2SCLL = 0xDC;
35 sbit STA = I2CON^5;
36 sbit SI = I2CON^3;
37
38
39 /***************************************************************
40 * 接收字节函数
41 * 功能:读取总线传来的字节数据并发送应答位,正常接收返回1。
42 * 入口参数:c 此时读入的数据变量的地址
43 * 出口参数:接收到总线结束信号或重新启动总线信号时返回0
44 ***************************************************************/
45 bit RcvByte(UINT8 *c)
46 { I2CON = RELEASE_BUS_ACK; /* 清除标志位 */
47 1 while( SI==0 ); /* 放开总线,等待接收 */
48 1 if( I2STAT==0xA0 ) /* 接收到停止位或重新启动位 */
49 1 { I2CON = RELEASE_BUS_ACK; /* 先放开总线,再返回0 */
50 2 return(0);
51 2 }
52 1 *c = I2DAT; /* 取数据 */
53 1 return(1);
54 1 }
55
C51 COMPILER V7.07 HI2CSLA_C51 11/18/2005 14:52:01 PAGE 2
56
57 /***************************************************************
58 * 发送数据
59 * 功能:向总线发送数据
60 * 入口参数:c 所要发送的数据
61 * 出口参数:当接收到非应答位时返回0,否则返回1
62 ***************************************************************/
63 bit SendByte(UINT8 c)
64 { if( I2STAT==0xC0 ) /* 上次发送数据后,接收到非应答位 */
65 1 { I2CON = RELEASE_BUS_ACK;
66 2 return(0);
67 2 }
68 1 I2DAT = c; /* 发送数据 */
69 1 I2CON = RELEASE_BUS_ACK; /* 释放总线 */
70 1 while( SI==0 ); /* 等待字节数据发送完成 */
71 1 return(1);
72 1 }
73
74
75
76 /****************************************************************
77 * 设置总线函数(设置为从机)
78 * 功能:用于设置I2C控制寄存器,包括总线时钟选择及从地址.不接受广播地址。
79 * 入口参数:addr 从地址
80 ****************************************************************/
81 void SetBus(UINT8 addr)
82 { I2ADR = addr&0xfe; /* 设置从地址不接收广播地址 */
83 1 I2CON = RELEASE_BUS_ACK; /* 启动硬件I2C */
84 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 52 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -