📄 i2cslave.lst
字号:
C51 COMPILER V7.06 I2CSLAVE 11/19/2003 11:38:14 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2CSLAVE
OBJECT MODULE PLACED IN i2cslave.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2cslave.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /***************************************************************************/
2 /* Name of module : I2CSLAVE.C */
3 /* Creation date : 12 March 2003 */
4 /* Program language : C */
5 /* Name : P.H. Seerden */
6 /* */
7 /* (C) Copyright 2003 Philips Semiconductors B.V. */
8 /* */
9 /***************************************************************************/
10 #include <REG932.H>
11 #include "ua_exprt.h"
12 typedef unsigned char BYTE;
13 typedef unsigned short WORD;
14
15 #define SLAVE_IDLE 0
16 #define SLAVE_BUSY 1
17 #define SLAVE_READY 2
18 #define SLAVE_TRX_ERROR 3
19 #define SLAVE_RCV_ERROR 4
20
21 #define GENERATE_STOP 0x54 // set STO, clear STA and SI
22 #define RELEASE_BUS_ACK 0x44 // clear STO,STA,SI and set AA (ack)
23 #define RELEASE_BUS_NOACK 0x40 // clear STO, STA, SI and AA (noack)
24 #define RELEASE_BUS_STA 0x64 // generate (rep)START, set STA
25
26 static BYTE count; // bytes send/received of current message
27 char slaveBuf[3];
28 static BYTE size; // size of slave mode buffer
29 static BYTE slaveStatus; // status of the slave
30
31 void I2C_Interrupt(void) interrupt 6 using 1
32 {
33 1 switch(I2STAT)
34 1 {
35 2 case 0x60: // own SLA+W received, Ack returned
36 2 case 0x68: // Addressed as slave
37 2 case 0x70: // General call received, Ack returned
38 2 case 0x78:
39 2 slaveStatus = SLAVE_BUSY; // Data will be received
40 2 count = 0;
41 2 if (size > 1)
42 2 I2CON = RELEASE_BUS_ACK; // return ACK on first byte
43 2 else
44 2 I2CON = RELEASE_BUS_NOACK; // return NACK on first byte
45 2 break;
46 2 case 0x80:
47 2 case 0x90: // Data received, ACK returned
48 2 slaveBuf[count++] = I2DAT; // read data
49 2 if (count == size)
50 2 I2CON = RELEASE_BUS_NOACK; // return NACK on next byte
51 2 else
52 2 I2CON = RELEASE_BUS_ACK; //* return ACK on next byte
53 2 break;
54 2 case 0x88:
55 2 case 0x98: // data received, NACK returned
C51 COMPILER V7.06 I2CSLAVE 11/19/2003 11:38:14 PAGE 2
56 2 slaveStatus = SLAVE_RCV_ERROR;
57 2 I2CON = RELEASE_BUS_ACK; // clr SI, set AA
58 2 break;
59 2 case 0xA0: // STOP or REP.START received, addressed as slave
60 2 slaveStatus = SLAVE_READY;
61 2 I2CON = RELEASE_BUS_ACK; // clr SI, set AA
62 2 break;
63 2 case 0xB0: // Arb. lost as MST, addressed as slave transmitter
64 2 slaveStatus = SLAVE_BUSY;
65 2 count = 0;
66 2 I2DAT = slaveBuf[count++]; // Transmit next data, restart
67 2 I2CON = RELEASE_BUS_STA; // MST mode if bus is free again
68 2 break;
69 2 case 0xA8: // Addressed as slave transmitter
70 2 slaveStatus = SLAVE_BUSY;
71 2 count = 0;
72 2 case 0xB8: // Data transmitted, ACK received
73 2 I2DAT = slaveBuf[count++]; // Transmit next data
74 2 I2CON = RELEASE_BUS_ACK; // clr SI, set AA
75 2 break;
76 2 case 0xC0: // Data transmitted, NOT ACK received
77 2 slaveStatus = SLAVE_TRX_ERROR;
78 2 case 0xC8:
79 2 I2CON = RELEASE_BUS_ACK; // clr SI, set AA
80 2 break;
81 2 default:
82 2 break;
83 2 }
84 1 }
85
86 //void I2C_Init(BYTE *buf, BYTE size)
87 void I2C_Init(void)
88 {
89 1 unsigned char temp;
90 1 slaveStatus = SLAVE_IDLE;
91 1 slaveBuf[0] = 0xA5;
92 1 slaveBuf[1] = 0x55;
93 1 slaveBuf[2] = 0x99;
94 1 size = 3;
95 1
96 1 P1M1 |= 0x0C; // Configure P1.2 and P1.3 to open drain
97 1 P1M2 |= 0x0C;
98 1
99 1 //*****************************************************************************
100 1 //* Modified from Paul's code to select an address depending on the jumper
101 1 //* settings of A2, A1 and A0
102 1 //*****************************************************************************
103 1 temp = P0;
104 1 temp &= 0x07; // mask out non address bits
105 1 temp <<= 1; // shift left one
106 1 I2ADR = (0xE0 | temp); // generate I2C address depending on P0
107 1 //*****************************************************************************
108 1 //* End modification
109 1 //*****************************************************************************
110 1
111 1 I2SCLH = 0x05;
112 1 I2SCLL = 0x04;
113 1 I2CON = RELEASE_BUS_ACK; // enable I2C hardware
114 1 EI2C = 1; // enable I2C interrupt
115 1 }
116
117 void I2C_ProcessSlave(void)
C51 COMPILER V7.06 I2CSLAVE 11/19/2003 11:38:14 PAGE 3
118 /**************************
119 * Input(s) : None.
120 * Output(s) : None.
121 * Returns : None.
122 * Description: Process the slave.
123 * This function must be called by the application to check
124 * the slave status. The USER should adapt this function to
125 * his personal needs (take the right action at a certain
126 * status).
127 ***************************************************************************/
128 {
129 1 switch(slaveStatus)
130 1 {
131 2 case SLAVE_IDLE :
132 2 /* do nothing or fill transmit buffer for transfer */
133 2 break;
134 2 case SLAVE_BUSY :
135 2 /* do nothing if interrupt driven */
136 2 break;
137 2 case SLAVE_READY :
138 2 /* read or fill buffer for next transfer, signal application */
139 2 slaveStatus = SLAVE_IDLE;
140 2 break;
141 2 case SLAVE_TRX_ERROR :
142 2 /* generate error message */
143 2 slaveStatus = SLAVE_IDLE;
144 2 break;
145 2 case SLAVE_RCV_ERROR :
146 2 /* generate error message */
147 2 slaveStatus = SLAVE_IDLE;
148 2 break;
149 2 }
150 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 230 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
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 + -