/
I2C_S.c
148 lines (114 loc) · 4.34 KB
/
I2C_S.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*---------------------------------------------------------------------------------------------------------*/
/* */
/* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved. */
/* */
/*---------------------------------------------------------------------------------------------------------*/
//***********************************************************************************************************
// Nuvoton Technoledge Corp.
// Website: http://www.nuvoton.com
// E-Mail : MicroC-8bit@nuvoton.com
// Date : May/1/2015
//***********************************************************************************************************
//***********************************************************************************************************
// File Function: N76E003 I2C Slave demo code
//***********************************************************************************************************
#include "N76E003.h"
//***********************************************************************************************************
// N76E885-series I2C slave mode demo code, the Slave address = 0xA4
//
// ____________ _____________
// | | SDA | |
// | |<-------->| |
// | | | |
// |N76E003(M) | | N76E003(S) |
// |(I2C_Master)| | (I2C_Slave) |
// | | SCL | |
// | |--------->| |
// |____________| |_____________|
//
// The protocol of I2C is same the "24LC64"
//***********************************************************************************************************
#define I2C_CLOCK 13
#define EEPROM_SLA 0xA4
UINT8 data_received[34], data_num = 0;
//========================================================================================================
void I2C_ISR(void) interrupt 6
{
switch (I2STAT)
{
case 0x00:
STO = 1;
break;
case 0x60:
AA = 1;
//P3 = 0x60;
break;
case 0x68:
P02 = 0;
while(1);
break;
case 0x80:
//P3 = 0x80;
data_received[data_num] = I2DAT;
data_num++;
if (data_num == 34)
AA = 0;
else
AA = 1;
break;
case 0x88:
//P3 = 0x88;
data_received[data_num] = I2DAT;
data_num = 0;
AA = 1;
break;
case 0xA0:
//P3 = 0xA0;
AA = 1;
break;
case 0xA8:
//P3 = 0xA0;
I2DAT = data_received[data_num];
data_num++;
AA = 1;
break;
case 0xB8:
//P3 = 0xB8;
I2DAT = data_received[data_num];
data_num++;
AA = 1;
break;
case 0xC0:
AA = 1;
break;
case 0xC8:
//P3 = 0xC8;
AA = 1;
break;
}
SI = 0;
// while(STO);
}
//========================================================================================================
void Init_I2C(void)
{
P13_Quasi_Mode; //set SCL (P13) is Quasi mode
P14_Quasi_Mode; //set SDA (P14) is Quasi mode
SDA = 1; //set SDA and SCL pins high
SCL = 1;
set_P0SR_6; //set SCL (P06) is Schmitt triggered input select.
set_EI2C; //enable I2C interrupt by setting IE1 bit 0
set_EA;
I2ADDR = EEPROM_SLA; //define own slave address
set_I2CEN; //enable I2C circuit
set_AA;
}
//========================================================================================================
void main(void)
{
Set_All_GPIO_Quasi_Mode;
/* Initial I2C function */
Init_I2C(); //initial I2C circuit
while (1);
/* =================== */
}