⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_135.lst

📁 基于MSP430的电表终端上的CT检测程序
💻 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 + -