📄 twi_lib.lst
字号:
C51 COMPILER V7.50 TWI_LIB 02/16/2009 09:59:54 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TWI_LIB
OBJECT MODULE PLACED IN twi_lib.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE lib_mcu\twi\twi_lib.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\twi_lib.lst)
-OBJECT(twi_lib.obj)
line level source
1
2 #include "config.h" /* system configuration */
3 #include "twi_lib.h"
4 #include "lib_mcu\lcd\lcd_drv.h"
5 #include <intrins.h>
6
7
8 #define IIC_BIT_BANG
9
10 #ifdef IIC_BIT_BANG
11
12
13
14 ///////////////////////////////////////////////////////////////////
15 void Start_I2c()
16 {
17 1 SDA=1; /*发送起始条件的数据信号*/
18 1 _Nop();
19 1 SCL=1;
20 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
21 1 _Nop();
22 1 _Nop();
23 1 _Nop();
24 1 _Nop();
25 1 SDA=0; /*发送起始信号*/
26 1 _Nop(); /* 起始条件锁定时间大于4*/
27 1 _Nop();
28 1 _Nop();
29 1 _Nop();
30 1 _Nop();
31 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
32 1 _Nop();
33 1 _Nop();
34 1 }
35
36
37 //////////////////////////////////////////////////////////////////////////
38 void Stop_I2c()
39 {
40 1 SDA=0; /*发送结束条件的数据信号*/
41 1 _Nop(); /*发送结束条件的时钟信号*/
42 1 SCL=1; /*结束条件建立时间大于4us*/
43 1 _Nop();
44 1 _Nop();
45 1 _Nop();
46 1 _Nop();
47 1 _Nop();
48 1 SDA=1; /*发送I2C总线结束信号*/
49 1 _Nop();
50 1 _Nop();
51 1 _Nop();
52 1 _Nop();
53 1 }
54
C51 COMPILER V7.50 TWI_LIB 02/16/2009 09:59:54 PAGE 2
55 /////////////////////////////////////////////////////////////////////////
56 bit SendByte(uchar c)
57 {
58 1 INT8U i;
59 1 bit bAck;
60 1
61 1 for(i=0; i<8; i++)
62 1 {
63 2 if((c << i) & 0x80)
64 2 SDA = 1;
65 2 else
66 2 SDA = 0;
67 2
68 2 _Nop();
69 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
70 2 _Nop();
71 2 _Nop(); /*保证时钟高电平周期大于4μs*/
72 2 _Nop();
73 2 _Nop();
74 2 _Nop();
75 2 SCL=0;
76 2 }
77 1
78 1 _Nop();
79 1 _Nop();
80 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
81 1 _Nop();
82 1 _Nop();
83 1 SCL=1;
84 1 _Nop();
85 1 _Nop();
86 1 _Nop();
87 1 if(SDA == 1)
88 1 bAck = 0;
89 1 else
90 1 bAck = 1; /*判断是否接收到应答信号*/
91 1 SCL=0;
92 1 _Nop();
93 1 _Nop();
94 1 return bAck;
95 1 }
96
97
98 //////////////////////////////////////////////////////////////////////////////////////////////
99 void IIC_init(void)
100 {
101 1 SCL=0;
102 1 Stop_I2c();
103 1 }
104
105
106 //////////////////////////////////////////////////////////////////////////////////////////////
107 bit iic_send(unsigned char slave_adr, bit rw, unsigned char nbbytes, unsigned char *info )
108 {
109 1 INT8U *cp;
110 1 bit rc = 0;
111 1
112 1 if(rw == I2C_WRITE)
113 1 {
114 2 Start_I2c();
115 2
116 2 if( (rc = SendByte(slave_adr << 1)) == 1) //ack received
C51 COMPILER V7.50 TWI_LIB 02/16/2009 09:59:54 PAGE 3
117 2 {
118 3 lcd_print_string(0x40, "acked");
119 3 for(cp=info; nbbytes--; cp++)
120 3 {
121 4 if( (rc = SendByte(*cp)) == 0 )
122 4 break;
123 4 }
124 3 }
125 2 }
126 1 Stop_I2c();
127 1 return rc;
128 1 }
129
130
131 #endif
132
133
134
135 ////////////////////////////////////////////////////////////////////////////
136 #ifndef IIC_BIT_BANG
volatile bit b_I2C_busy;
volatile unsigned char I2C_Err;
volatile unsigned char I2C_nb_transmited;
volatile unsigned char I2C_RecPtr;
volatile unsigned char xdata I2C_slave_data[I2C_NB_SLAVE_DATA];
volatile I2C_type_message xdata I2C_message;
/*F**************************************************************************
* NAME: i2c_baud_rate
*----------------------------------------------------------------------------
* PARAMS:
* return: value for CR2..CR0
*----------------------------------------------------------------------------
* PURPOSE:
* returns correct value for CR2..CR0.
*----------------------------------------------------------------------------
* EXAMPLE:
* SSCON |= i2c_baud_rate(256);
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
unsigned char I2C_baud_rate (unsigned int ratio)
{
switch ( ratio )
{
case 256:
return I2C_RATIO_256;
break;
case 224:
return I2C_RATIO_224;
break;
C51 COMPILER V7.50 TWI_LIB 02/16/2009 09:59:54 PAGE 4
case 192:
return I2C_RATIO_192;
break;
case 160:
return I2C_RATIO_160;
break;
case 960:
return I2C_RATIO_960;
break;
case 120:
return I2C_RATIO_120;
break;
case 60:
return I2C_RATIO_60;
break;
}
}
/*F**************************************************************************
* NAME: I2C_decode_status
*----------------------------------------------------------------------------
* PARAMS:
* return: none
*----------------------------------------------------------------------------
* PURPOSE:
* main processing state machine for I2C message reception transmission
* in slave or master mode.
* This function is called when an event occured on the I2C interface.
* Can be used both in polling or interrupt mode.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -