📄 i2c_master.lst
字号:
##############################################################################
# #
# IAR MSP430 C/C++ Compiler V3.30A/W32 04/Jun/2005 12:04:35 #
# Copyright 1996-2005 IAR Systems. All rights reserved. #
# #
# __rt_version = 2 #
# __double_size = 32 #
# __reg_r4 = free #
# __reg_r5 = free #
# __pic = no #
# __core = 64kb #
# Source file = C:\Work\Assignments\DaVinci_EVM\Workspace\c\i2c_master #
# .c #
# Command line = -lcN C:\Work\Assignments\DaVinci_EVM\Workspace\Debug\L #
# ist\ -la C:\Work\Assignments\DaVinci_EVM\Workspace\Deb #
# ug\List\ -o C:\Work\Assignments\DaVinci_EVM\Workspace\ #
# Debug\Obj\ -z2 --no_cse --no_unroll --no_inline #
# --no_code_motion --no_tbaa --debug -e --double=32 -I #
# C:\Work\Assignments\DaVinci_EVM\Workspace\INC\ -I #
# "C:\Program Files\IAR Systems\V330A_Full\430\INC\" -I #
# "C:\Program Files\IAR Systems\V330A_Full\430\INC\CLIB\ #
# " C:\Work\Assignments\DaVinci_EVM\Workspace\c\i2c_mast #
# er.c #
# List file = C:\Work\Assignments\DaVinci_EVM\Workspace\Debug\List\i #
# 2c_master.lst #
# Object file = C:\Work\Assignments\DaVinci_EVM\Workspace\Debug\Obj\i2 #
# c_master.r43 #
# #
# #
##############################################################################
C:\Work\Assignments\DaVinci_EVM\Workspace\c\i2c_master.c
1 //******************************************************************************
2 //
3 // /|\ /|\
4 // MSP430F169 5k 5k MSP430F169
5 // slave | | master
6 // -----------------| | | -----------------
7 // 8Mhz--|XT2IN P2.0|<-|----+>|P3.1 |
8 // |XT2OUT | | | |
9 // | | | | XIN|-- 32768 Hz
10 // 32768Hz--|XIN P1.0|<-+----->|P3.3 XOUT|--
11 // |XOUT | | |
12 //
13 //
14 //******************************************************************************
15 #include <msp430x16x.h>
16
17 #define UART_TX_RETRY 10000
18
19 //#define DELTA 900 // target DCO = DELTA*(4096) = 3686400
20 #define DELTA 244 // target DCO = DELTA*(4096) = 1048576
21 //#define DELTA 70 // target DCO = DELTA*(4096) = 286720
22
23 #define DCO_FREQ ((double)DELTA * 4096) // DCO frequency
24 #define UART_BAUD_RATE 9600 // Baud Rate
25
26
27 #define DEBOUNCE_CNT 20
28 #define I2C_ADDR 0x23
29
30
31 #define EVENT_SW1 0x01
32 #define EVENT_SW2 0x02
33 #define EVENT_INT 0x04
34
35
36 //
37 // I2C Message Identifiers
38 //
39 #define SET_RTC_PARAMS 0
40 #define GET_RTC_PARAMS 1
41 #define SEND_IR_DATA 2
42 #define GET_LAST_IR_VALUE 3
43 #define GET_INPUT_STATE 4
44 #define GET_EVENT 5
45
46
47 //
48 // Event Flags for I2C getEvent message
49 //
50 #define EVENT_STATE_CHG 0x01 // Input signal state change
51 #define EVENT_IR_DATA 0x02 // IR data ready
52
53
54 void sysInit(void);
55 void setDCO(void);
56 void configUart1(void);
57 void configI2C(void);
58 void configWDT(void);
59 void iicSend(unsigned char addr, unsigned char bytes, unsigned char rwflag);
60 void sw1Options(void);
61 void sw2Options(void);
62 void txStr(const char* pStr);
63 void txByte(unsigned char byte);
64 void txWord(unsigned int word);
65 void setRTC(void);
66 void getRTC(void);
67 void getIRData(void);
68 void getIRVal(void);
69 void getInputState(void);
70 void getEvent(void);
71
72
73
74 unsigned char rxMsgLen;
75 unsigned char debounceCnt[3];
76 unsigned char Event = 0;
77 unsigned char rxIdx;
78 unsigned char RX_DATA[32];
79 unsigned char txIdx;
80 unsigned char TX_DATA[32];
81
82
83 //
84 // Low-level system initialization - called prior to main()
85 //
86 int __low_level_init(void)
87 {
88 WDTCTL = WDTPW + WDTHOLD; // Stop WDT
89 return (1); // Force initialization of RAM
90 // return (0); // Skip initialization of RAM
91 }
92
93
94 //
95 // Set DCO to selected frequency
96 //
97 void setDCO(void)
98 {
99 unsigned int Compare, Oldcapture = 0;
100
101 BCSCTL1 |= DIVA_3; // ACLK= LFXT1CLK/8
102 CCTL2 = CM_1 + CCIS_1 + CAP; // CAP, ACLK
103 TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear
104
105 while(1)
106 {
107 while (!(CCIFG & CCTL2)); // Wait until capture occured
108 CCTL2 &= ~CCIFG; // Capture occured, clear flag
109 Compare = CCR2; // Get current captured SMCLK
110 Compare = Compare - Oldcapture; // SMCLK difference
111 Oldcapture = CCR2; // Save current captured SMCLK
112
113 if (DELTA == Compare)
114 {
115 break; // If equal, leave "while(1)"
116 }
117 else if (DELTA < Compare) // DCO is too fast, slow it down
118 {
119 DCOCTL--;
120 if (DCOCTL == 0xFF)
121 {
122 if (!(BCSCTL1 == (XT2OFF + DIVA_3)))
123 BCSCTL1--; // Did DCO roll under?, Sel lower RSEL
124 }
125 }
126 else
127 {
128 DCOCTL++;
129 if (DCOCTL == 0x00)
130 {
131 if (!(BCSCTL1 == (XT2OFF + DIVA_3 + 0x07)))
132 BCSCTL1++; // Did DCO roll over? Sel higher RSEL
133 }
134 }
135 }
136
137 CCTL2 = 0; // Stop CCR2
138 TACTL = 0; // Stop Timer_A
139 }
140
141
142 //
143 // System Initialization
144 //
145 void sysInit(void)
146 {
147 setDCO(); // Set DCO
148
149 P1IES |= 0x30; // Set P1.5,4 for 1->0 interrupt
150 P1IFG = 0x00; // Clear P1 interrupt flags
151 P1IE |= 0x30; // Enable P1.5,4 interrupts
152
153 P5DIR |= 0x70; // P5.6,5,4 outputs
154 P5SEL |= 0x70; // P5.6,5,4 options
155
156 P2OUT = 0x00;
157 P2IES &= ~0x01; // Enable P2.0 interrupt
158 P2IFG &= ~0x01; // Enable P2.0 interrupt
159 P2IE |= 0x01; // Enable P2.0 interrupt
160
161 configI2C();
162
163 configUart1();
164
165 configWDT();
166 }
167
168
169 void configI2C(void)
170 {
171 P3SEL |= 0x0A; // Select I2C pins
172
173 U0CTL = SWRST; // Recommended init procedure
174 U0CTL |= I2C + SYNC; // Recommended init procedure
175 U0CTL &= ~I2CEN; // Recommended init procedure
176 I2COA = 0x30; // OWN ADDRESS
177 I2CPSC = 0;
178 I2CSCLH = 0;
179 I2CSCLL = 0;
180 I2CTCTL = I2CSSEL1+I2CRM; // SMCLK, repeat Mode
181 U0CTL |= I2CEN; // Enable I2C
182 }
183
184
185 //
186 // Configure USART1 for UART mode
187 //
188 void configUart1(void)
189 {
190 unsigned int rate;
191
192 // Calculate Buad Rate Clock divider values
193 rate = (DCO_FREQ/UART_BAUD_RATE);
194
195 P3SEL |= 0xC0; // P3.7,6 = URXD1/UTXD1
196 ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
197 U1CTL |= (CHAR + SWRST); // 8-bit char, reset
198 U1TCTL |= SSEL1; // BRCLK = SMCLK
199 U1BR0 = (unsigned char)(rate & 0xff); // Lower 8 bits of BR clk divider
200 U1BR1 = (unsigned char)(rate >> 8); // Upper 8 bits of BR clk divider
201 U1MCTL = 0; // Modulation
202 U1CTL &= ~SWRST; // Initialize USART state machine
203 IE2 |= URXIE1; // Enable USART1 RX interrupt
204 }
205
206
207 //
208 // Configure Watchdog Timer
209 //
210 void configWDT(void)
211 {
212 WDTCTL = WDT_ADLY_1_9; // Clk source is ACLK,
213 // interval timer mode,
214 // clear, divide by 32768
215 }
216
217
218 //
219 // I2C Send
220 //
221 void iicSend(unsigned char addr, unsigned char bytes, unsigned char rwflag)
222 {
223 while( I2CDCTL & I2CBB ){} // Wait for I2C bus to stop being busy
224
225 if( rwflag ) // Read
226 {
227 I2CIE = 0; // Disable I2C interrupts
228 I2CIFG = 0;
229 rxIdx = 0; // Reset buffer index
230 I2CSA = addr; // Slave Address is 048h
231 U0CTL &= ~I2CEN; // Recommended init procedure
232 I2CTCTL = I2CSSEL1 + I2CRM; // SMCLK, repeat Mode
233 U0CTL |= I2CEN; // Enable I2C
234 I2CIE = RXRDYIE; // Enable RXRDYIFG interrupt
235 U0CTL |= MST;
236 I2CTCTL |= I2CSTT;
237 }
238 else // Write
239 {
240 I2CIE = 0; // Disable I2C interrupts
241 I2CIFG = 0;
242 txIdx = 0; // Reset buffer index
243 I2CSA = addr; // Slave Address is 048h
244 U0CTL &= ~I2CEN; // Recommended init procedure
245 I2CTCTL = I2CSSEL1; // SMCLK
246 U0CTL |= I2CEN; // Enable I2C
247
248 I2CNDAT = bytes; // Set number of bytes to write
249 I2CIE = TXRDYIE; // Enable I2C interrupts
250 U0CTL |= MST; // Master
251 I2CTCTL |= I2CTRX + I2CSTT + I2CSTP; // Transmit, start, stop
252 }
253 }
254
255
256 //
257 // Main
258 //
259 void main(void)
260 {
261 unsigned char x;
262
263 // Initialize System
264 sysInit();
265
266 txStr("\x1b[2JI2C Master\r\n\n");
267
268 while(1)
269 {
270 if( Event == 0 )
271 {
272 // Enter low-power mode 0 with interrupts enabled
273 _BIS_SR(LPM0_bits + GIE);
274
275 _NOP();
276 }
277
278 if( Event & EVENT_SW1 )
279 {
280 Event &= ~EVENT_SW1; // SW1 Event
281 sw1Options();
282 }
283
284 if( Event & EVENT_SW2 )
285 {
286 Event &= ~EVENT_SW2; // SW2 Event
287 sw2Options();
288 }
289
290 if( Event & EVENT_INT )
291 {
292 Event &= ~EVENT_INT; // Interrupt Event
293
294 txStr("\r\n\nInt - Get Interrupt Event");
295 getEvent();
296 iicSend(I2C_ADDR, TX_DATA[0], 0); // I2C write
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -