📄 spi_135.lst
字号:
##############################################################################
# #
# IAR MSP430 C/C++ Compiler V3.21A/W32 [Kickstart] 19/Sep/2005 17:10:34 #
# Copyright 1996-2004 IAR Systems. All rights reserved. #
# #
# __rt_version = 2 #
# __double_size = 64 #
# __reg_r4 = free #
# __reg_r5 = free #
# __pic = no #
# __core = 64kb #
# Source file = D:\WILLFARwork\CT项目\CT开短路MSP430\程序\1A_Check_200 #
# 50906\SPI_135.c #
# Command line = -I "D:\Program Files\IAR Systems\Embedded Workbench #
# 4.0\430\INC\" -I "D:\Program Files\IAR #
# Systems\Embedded Workbench 4.0\430\INC\DLIB\" -lC #
# D:\WILLFARwork\CT项目\CT开短路MSP430\程序\1A_Check_200 #
# 50906\Debug\List\ -la D:\WILLFARwork\CT项目\CT开短路MS #
# P430\程序\1A_Check_20050906\Debug\List\ -o #
# D:\WILLFARwork\CT项目\CT开短路MSP430\程序\1A_Check_200 #
# 50906\Debug\Obj\ -z3 --no_cse --no_unroll --no_inline #
# --no_code_motion --no_tbaa --library_module #
# --module_name= --debug -e --double=64 --dlib_config #
# "D:\Program Files\IAR Systems\Embedded Workbench #
# 4.0\430\LIB\DLIB\dl430dn.h" #
# D:\WILLFARwork\CT项目\CT开短路MSP430\程序\1A_Check_200 #
# 50906\SPI_135.c #
# List file = D:\WILLFARwork\CT项目\CT开短路MSP430\程序\1A_Check_200 #
# 50906\Debug\List\SPI_135.lst #
# Object file = D:\WILLFARwork\CT项目\CT开短路MSP430\程序\1A_Check_200 #
# 50906\Debug\Obj\SPI_135.r43 #
# #
# #
##############################################################################
D:\WILLFARwork\CT项目\CT开短路MSP430\程序\1A_Check_20050906\SPI_135.c
1 //spi控制程序
2 //spi 协议: 70 08 读当前CT状态(430返回one_CT_state与two_CT_state两个值
3 // 70 09 启动初始化
4 // 70 07 启动检测
5 #include "msp430x13x.h"
6
7 unsigned char receive[16]; //SPI接收缓存区
8 unsigned char order_right; //命令正确执行状态
9 unsigned char receive_count=0; //SPI接收计数
10 unsigned char start_CT_check; //启动CT检测标志 0x01 启动CT检测 0x00关闭CT检测
11 unsigned char start_CT_save; //启动CT初始化标志 0x01 启动CT初始化 0x00关闭CT初始化
12 unsigned char receive_start=0; //SPI通讯时收到的起始字节状态位
13 extern unsigned char two_CT_state; //二次CT状态字
14 extern unsigned char ICC; //电流大小判断 0:1.5A 1:5A
15 extern unsigned int CT_check_data_a;
16 extern unsigned int CT_check_data_b;
17 extern unsigned int CT_check_data_c;
18 extern unsigned int CT_current_A,CT_current_B,CT_current_C;
19 extern unsigned char second_count; //TB的秒中断计数,用于通讯延时保护
20 void spi_init(void); //SPI总线初始化程序
21
22 unsigned char temp_H,temp_M,temp_L;
23 unsigned char temp_aH,temp_aM,temp_aL,temp_bH,temp_bM,temp_bL,temp_cH,temp_cM,temp_cL;
24
25
26 void hex_to_dec(unsigned long int a) //十六进制转十进制BCD
27 {
28 unsigned char temp1,temp2;
29 if (a>=0xf423f)
30 {
31 temp_H=0x99;
32 temp_M=0x99;
33 temp_L=0x99;
34 }
35 else
36 {
37 temp1= a / 100000;
38 temp2= (a % 100000)/10000;
39 temp_H= (temp1<<4)+temp2;
40 temp1= (a % 10000)/1000;
41 temp2= (a % 1000)/100;
42 temp_M= (temp1<<4)+temp2;
43 temp1= (a % 100)/10;
44 temp2= a % 10;
45 temp_L= (temp1<<4)+temp2;
46 }
47 }
48
49 //三字节十进制BCD码转换为两字节HEX码
50 unsigned int BCD_to_HEX(unsigned char H,unsigned char M,unsigned char L)
51 {
52 unsigned int temp;//,temp0,temp1,temp2;
53 temp=(((L>>4)*10)+(L&0x0f))+(((M>>4)*10)+(M&0x0f))*100+(((H>>4)*10)+(H&0x0f))*10000;
54 return temp;
55 }
56
57 void delay_n_ms(unsigned char a) //延时子程序
58 { unsigned char b,c;
59 for(;a>0;a--)
60 for(b=100;b>0;b--)
61 for(c=100;c>0;c--);
62 }
63
64 void clr_receive_buff(void) //清接收缓存区数据
65 { unsigned char a;
66 for(a=0;a<10;a++)
67 receive[a]=0;
68 receive_count=0;
69 second_count=0;
70 while(((IFG1&UTXIFG0)==0)&&(second_count<3));
71 U0TXBUF=0x00; //发送寄存器常为0x00
72 receive_start=0;
73 }
74
75 void spi_init(void) //SPI总线初始化程序
76 //配置为从机四线制通讯
77 {
78 P3SEL|=0x0f; //开启P3.0~P3.3的第二功能(复用为SPI总线)
79 UCTL0=CHAR+SYNC+SWRST; //8位数据,SPI从模式,
80 // UxTCTL //不用配置,SPI数据上升沿输出,输入数据在下降沿初锁存
81 U0ME=USPIE0;
82 UCTL0&=~SWRST;
83 IE1 |=URXIE0;
84 _EINT();
85 U0TXBUF=0xff;
86 }
87
88 void scend_spi_data (unsigned char spi_data)
89 { second_count=0;
90 while(((IFG1&UTXIFG0)==0)&&(second_count<3));
91 if(second_count<3) //发送超时判断!
92 U0TXBUF=spi_data;
93 else spi_init();
94 }
95
96
97 void spi_order(void)
98 {
99 unsigned char order;
100 order_right=0;
101 order=receive[1];
102 if(receive[0]==0x70)
103 { order_right=1;
104 switch (order)
105 { case 0x01 : start_CT_check=0x01; //开启一次CT检测
106 break;
107
108 case 0x02 : CT_current_A=BCD_to_HEX(receive[2],receive[3],receive[4]);
109 break;
110
111 case 0x03 : CT_current_B=BCD_to_HEX(receive[2],receive[3],receive[4]);
112 break;
113
114 case 0x04 : CT_current_C=BCD_to_HEX(receive[2],receive[3],receive[4]);
115 break;
116
117 case 0x05 : break;
118
119 case 0x06 : break;
120
121 case 0x07 : ICC=1;
122 break;
123 case 0x08 : scend_spi_data(two_CT_state); //二次CT状态字
124 scend_spi_data(0x00); //一次CT状态字只能为0
125 break;
126 case 0x09 : start_CT_save=0x01;
127
128 break;
129 case 0x81 : scend_spi_data(start_CT_check);
130 break;
131
132 case 0x82 :
133 scend_spi_data(temp_aH);
134 scend_spi_data(temp_aM);
135 scend_spi_data(temp_aL);
136 break;
137
138 case 0x83 :
139
140 scend_spi_data(temp_bH);
141 scend_spi_data(temp_bM);
142 scend_spi_data(temp_bL);
143
144 break;
145
146 case 0x84 :
147 scend_spi_data(temp_cH);
148 scend_spi_data(temp_cM);
149 scend_spi_data(temp_cL);
150 break;
151
152 case 0x89 : scend_spi_data(start_CT_save);
153 break;
154 default : second_count=0;
155 break;
156 }
157 }
158
159 }
160
161
162 #pragma vector=USART0RX_VECTOR
163 __interrupt void SPI0_rx (void)
164 { unsigned char aa;
^
Warning[Pe550]: variable "aa" was set but never used
165 if(U0RXBUF==0xff) //不接收0xff的字符
166 return;
167 receive[receive_count]=U0RXBUF;
168 receive_count++;
169 aa=receive[1];
170 if(receive_count==2)
171 {
172
173 spi_order();
174 if(order_right==1)
175 clr_receive_buff();
176 }
177 }
178
179
180 void receive_n_check(void)
181 { if(receive_count>4)
182 {
183 receive_count=0;
184 spi_order();
185 if(order_right==0)
186 {
187 delay_ns(200);
^
Warning[Pe223]: function declared implicitly
188 spi_init();
189 }
190 clr_receive_buff();
191 }
192 }
Errors: 1
Warnings: 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -