📄 cs8900.lst
字号:
##############################################################################
# #
# IAR MSP430 C/C++ Compiler V3.41C/W32 [Kickstart] 08/May/2009 10:30:20 #
# Copyright 1996-2006 IAR Systems. All rights reserved. #
# #
# __rt_version = 2 #
# __double_size = 32 #
# __reg_r4 = free #
# __reg_r5 = free #
# __pic = no #
# __core = 64kb #
# Source file = F:\rf\参考资料\NET430\Internet\slaa137a\cs8900.c #
# Command line = F:\rf\参考资料\NET430\Internet\slaa137a\cs8900.c #
# --preprocess F:\rf\参考资料\NET430\Internet\slaa137a\D #
# ebug\List\ -lCN F:\rf\参考资料\NET430\Internet\slaa137 #
# a\Debug\List\ -o F:\rf\参考资料\NET430\Internet\slaa13 #
# 7a\Debug\Obj\ -s3 --no_cse --no_unroll --no_inline #
# --no_code_motion --no_tbaa --debug -e --double=32 -I #
# "D:\Program Files\IAR Systems\Embedded Workbench #
# 4.0\430\INC\" -I "D:\Program Files\IAR #
# Systems\Embedded Workbench 4.0\430\INC\CLIB\" #
# List file = F:\rf\参考资料\NET430\Internet\slaa137a\Debug\List\cs8 #
# 900.lst #
# Object file = F:\rf\参考资料\NET430\Internet\slaa137a\Debug\Obj\cs89 #
# 00.r43 #
# #
# #
##############################################################################
F:\rf\参考资料\NET430\Internet\slaa137a\cs8900.c
1 //------------------------------------------------------------------------------
2 // Name: cs8900.c
3 // Func: ethernet driver for use with LAN controller CS8900A
4 // Ver.: 1.1
5 // Date: January 2004
6 // Auth: Andreas Dannenberg
7 // MSP430 Applications
8 // Texas Instruments Inc.
9 // Rem.: -
10 //------------------------------------------------------------------------------
11
12 #include "msp430x14x.h"
\ In segment DATA16_AN, at 0x19
\ unsigned char volatile __data16 P3OUT
\ P3OUT:
\ 000000 DS8 1
\ In segment DATA16_AN, at 0x1a
\ unsigned char volatile __data16 P3DIR
\ P3DIR:
\ 000000 DS8 1
\ In segment DATA16_AN, at 0x30
\ unsigned char const volatile __data16 P5IN
\ P5IN:
\ 000000 DS8 1
\ In segment DATA16_AN, at 0x31
\ unsigned char volatile __data16 P5OUT
\ P5OUT:
\ 000000 DS8 1
\ In segment DATA16_AN, at 0x32
\ unsigned char volatile __data16 P5DIR
\ P5DIR:
\ 000000 DS8 1
13 #include "support.h"
14 #include "cs8900.h"
15
16 //------------------------------------------------------------------------------
\ In segment DATA16_C, align 2, align-sorted
17 const unsigned int MyMAC[] = // "M1-M2-M3-M4-M5-M6"
\ MyMAC:
\ 000000 000102030405 DC16 256, 770, 1284
18 {
19
20 MYMAC_1 + (unsigned int)(MYMAC_2 << 8),
21 MYMAC_3 + (unsigned int)(MYMAC_4 << 8),
22 MYMAC_5 + (unsigned int)(MYMAC_6 << 8)
23 };
24
\ In segment DATA16_C, align 2, align-sorted
25 static const TInitSeq InitSeq[] =
\ InitSeq:
\ 000000 580100015A01 DC16 344, 256, 346, 770, 348, 1284, 274, 192, 260, 3328
\ 02035C010405
\ 1201C0000401
\ 000D
26 {
27 PP_IA, MYMAC_1 + (MYMAC_2 << 8), // set our MAC as Individual Address
28 PP_IA + 2, MYMAC_3 + (MYMAC_4 << 8),
29 PP_IA + 4, MYMAC_5 + (MYMAC_6 << 8),
30 PP_LineCTL, SERIAL_RX_ON | SERIAL_TX_ON, // configure the Physical Interface
31 PP_RxCTL, RX_OK_ACCEPT | RX_IA_ACCEPT | RX_BROADCAST_ACCEPT
32 };
33 //------------------------------------------------------------------------------
34 // configure port-pins for use with LAN-controller,
35 // issue reset and send the configuration-sequence (InitSeq[])
36 //------------------------------------------------------------------------------
\ In segment CODE, align 2
37 void Init8900(void)
\ Init8900:
38 {
39 unsigned int i;
40
41 P3OUT = IOR | IOW; // reset outputs, control lines high
\ 000000 F240C0001900 MOV.B #0xc0, &0x19
42 P3DIR = 0xff; // switch control port to output
\ 000006 F2431A00 MOV.B #0xff, &0x1a
43
44 P5OUT = 0; // reset outputs
\ 00000A C2433100 MOV.B #0x0, &0x31
45 P5DIR = 0xff; // switch data port to output
\ 00000E F2433200 MOV.B #0xff, &0x32
46
47 DelayCycles(40000); // delay 10ms @ 8MHz MCLK to allow
\ 000012 3C40409C MOV.W #0x9c40, R12
\ 000016 B012.... CALL #DelayCycles
48 DelayCycles(40000); // time for CS8900 POR
\ 00001A 3C40409C MOV.W #0x9c40, R12
\ 00001E B012.... CALL #DelayCycles
49
50 Write8900(ADD_PORT, PP_SelfCTL); // set register
\ 000022 3E401401 MOV.W #0x114, R14
\ 000026 7C400A00 MOV.B #0xa, R12
\ 00002A B012.... CALL #Write8900
51 Write8900(DATA_PORT, POWER_ON_RESET); // reset the Ethernet-Controller
\ 00002E 3E404000 MOV.W #0x40, R14
\ 000032 7C400C00 MOV.B #0xc, R12
\ 000036 B012.... CALL #Write8900
52
53 do
54 Write8900(ADD_PORT, PP_SelfST); // set register
\ ??Init8900_0:
\ 00003A 3E403601 MOV.W #0x136, R14
\ 00003E 7C400A00 MOV.B #0xa, R12
\ 000042 B012.... CALL #Write8900
55 while (!(Read8900(DATA_PORT) & INIT_DONE)); // wait until chip-reset is done
\ 000046 7C400C00 MOV.B #0xc, R12
\ 00004A B012.... CALL #Read8900
\ 00004E 4C93 CMP.B #0x0, R12
\ 000050 F437 JGE ??Init8900_0
56
57 for (i = 0; i < sizeof InitSeq / sizeof (TInitSeq); i++) // configure the CS8900
\ 000052 0D43 MOV.W #0x0, R13
\ 000054 133C JMP ??Init8900_2
58 {
59 Write8900(ADD_PORT, InitSeq[i].Addr);
\ ??Init8900_1:
\ 000056 0F4D MOV.W R13, R15
\ 000058 0F5F RLA.W R15
\ 00005A 0F5F RLA.W R15
\ 00005C 1E4F.... MOV.W InitSeq(R15), R14
\ 000060 7C400A00 MOV.B #0xa, R12
\ 000064 B012.... CALL #Write8900
60 Write8900(DATA_PORT, InitSeq[i].Data);
\ 000068 0F4D MOV.W R13, R15
\ 00006A 0F5F RLA.W R15
\ 00006C 0F5F RLA.W R15
\ 00006E 1E4F.... MOV.W InitSeq + 2(R15), R14
\ 000072 7C400C00 MOV.B #0xc, R12
\ 000076 B012.... CALL #Write8900
61 }
\ 00007A 1D53 ADD.W #0x1, R13
\ ??Init8900_2:
\ 00007C 3D900500 CMP.W #0x5, R13
\ 000080 EA2B JNC ??Init8900_1
62 }
\ 000082 3041 RET
63 //------------------------------------------------------------------------------
64 // writes a word in little-endian byte order to
65 // a specified port-address
66 //------------------------------------------------------------------------------
\ In segment CODE, align 2
67 void Write8900(unsigned char Address, unsigned int Data)
\ Write8900:
68 {
69 P5DIR = 0xff; // data port to output
\ 000000 F2433200 MOV.B #0xff, &0x32
70 P3OUT = IOR | IOW | Address; // put address on bus
\ 000004 4F4C MOV.B R12, R15
\ 000006 7FD0C000 BIS.B #0xc0, R15
\ 00000A C24F1900 MOV.B R15, &0x19
71 P5OUT = Data; // write low order byte to data bus
\ 00000E 4F4E MOV.B R14, R15
\ 000010 C24F3100 MOV.B R15, &0x31
72 P3OUT &= ~IOW; // toggle IOW-signal
\ 000014 F2C080001900 BIC.B #0x80, &0x19
73 P3OUT = IOR | IOW | (Address + 1); // and put next address on bus
\ 00001A 5C53 ADD.B #0x1, R12
\ 00001C 7CD0C000 BIS.B #0xc0, R12
\ 000020 C24C1900 MOV.B R12, &0x19
74 P5OUT = Data >> 8; // write high order byte to data bus
\ 000024 8E10 SWPB R14
\ 000026 3EF0FF00 AND.W #0xff, R14
\ 00002A C24E3100 MOV.B R14, &0x31
75 P3OUT &= ~IOW; // toggle IOW-signal
\ 00002E F2C080001900 BIC.B #0x80, &0x19
76 P3OUT |= IOW;
\ 000034 F2D080001900 BIS.B #0x80, &0x19
77 }
\ 00003A 3041 RET
78 //------------------------------------------------------------------------------
79 // writes a word in little-endian byte order to TX_FRAME_PORT
80 //------------------------------------------------------------------------------
\ In segment CODE, align 2
81 void WriteFrame8900(unsigned int Data)
\ WriteFrame8900:
82 {
83 P5DIR = 0xff; // data port to output
\ 000000 F2433200 MOV.B #0xff, &0x32
84 P3OUT = IOR | IOW | TX_FRAME_PORT; // put address on bus
\ 000004 F240C0001900 MOV.B #0xc0, &0x19
85 P5OUT = Data; // write low order byte to data bus
\ 00000A 4E4C MOV.B R12, R14
\ 00000C C24E3100 MOV.B R14, &0x31
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -