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

📄 i2c_master.lst

📁 msp430板子红外驱动
💻 LST
📖 第 1 页 / 共 3 页
字号:
##############################################################################
#                                                                            #
# 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 + -