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

📄 i2c_master.c

📁 MSP430和GPS的接口程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    I2CDRB = TX_DATA[txIdx++];
    break;
  case 0x0E: break;                         // GCIFG: n/a
  case 0x10: break;                         // STTIFG: n/a
  }
}


//
// PORT 1 Interrupt Service Routine
//
#pragma vector=PORT1_VECTOR
__interrupt void port1_ISR (void)
{
  // P1.4
  if( P1IFG & 0x10 )
  {
    P1IE  &= ~0x10;                         // Disable interrupt
    P1IFG &= ~0x10;                         // Clear interrupt flag
    debounceCnt[0] = DEBOUNCE_CNT;
    IE1 |= WDTIE;                           // Enable WDT interrupt
  }

  // P1.5
  if( P1IFG & 0x20 )
  {
    P1IE  &= ~0x20;                         // Disable interrupt
    P1IFG &= ~0x20;                         // Clear interrupt flag
    debounceCnt[1] = DEBOUNCE_CNT;
    IE1 |= WDTIE;                           // Enable WDT interrupt
  }
}


//
// PORT 2 Interrupt Service Routine
//
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{
  // P2.0
  if( P2IFG & 0x01 )
  {
    P2IE  &= ~0x01;                         // Disable interrupt
    P2IFG &= ~0x01;                         // Clear interrupt flag
    Event |= EVENT_INT;                     // Set event flag
    LPM0_EXIT;                              // Exit LPM0
  }
}



//
// Watchdog Timer (WDT) Interrupt Service Routine
//
#pragma vector=WDT_VECTOR
__interrupt void wdt_ISR(void)
{
  unsigned char contFlag = 0;

  if( debounceCnt[0] > 0 )
  {
    if( --debounceCnt[0] == 0 )
    {
      P1IFG &= ~0x10;                       // Clear interrupt flag
      P1IE  |=  0x10;                       // Enable interrupt
      Event |= EVENT_SW1;                   // Set event flag
      LPM0_EXIT;                            // Exit LPM0
    }
    else
    {
      contFlag = 1;                         // Set continue WDT flag
    }
  }

  if( debounceCnt[1] > 0 )
  {
    if( --debounceCnt[1] == 0 )
    {
      P1IFG &= ~0x20;                       // Clear interrupt flag
      P1IE  |=  0x20;                       // Enable interrupt
      Event |= EVENT_SW2;                   // Set event flag
      LPM0_EXIT;                            // Exit LPM0
    }
    else
    {
      contFlag = 1;                         // Set continue WDT flag
    }
  }

  if( !contFlag )
  {
    IE1 &= ~WDTIE;                          // Disable WDT interrupt
  }
}


//
// SW1 Options
//
void sw1Options(void)
{
  unsigned char option;

  option = (P4IN >> 4);                     // Read value on pins P4.7,6,5,4

  switch( option )
  {
    case 0x00:
      break;
    case 0x01:
      break;
    case 0x02:
      break;
    case 0x03:
      break;
    case 0x04:
      break;
    case 0x05:
      break;
    case 0x06:
      break;
    case 0x07:
      break;
    case 0x08:
      break;
    case 0x09:
      break;
    case 0x0A:
      break;
    case 0x0B:
      break;
    case 0x0C:
      break;
    case 0x0D:
      break;
    case 0x0E:
      break;
    case 0x0F:
      break;
  };
}


//
// SW2 Options
//
void sw2Options(void)
{
  unsigned char x;
  unsigned char option;

  option = (P4IN >> 4);                     // Read value on pins P4.7,6,5,4

  switch( option )
  {
    case 0x00:                              // Get RTC params
      txStr("\r\n\nGet RTC Parameters");
      getRTC();
      iicSend(I2C_ADDR, TX_DATA[0], 0);     // I2C write
      iicSend(I2C_ADDR, 0, 1);              // I2C read
      txStr("\r\nRTC Parameters:");
      for(x = 1; x < RX_DATA[0]; x++)
      {
        txStr(" ");
        txByte(RX_DATA[x]);
      }
      break;
    case 0x01:
      txStr("\r\n\nSet RTC Parameters");
      setRTC();
      iicSend(I2C_ADDR, TX_DATA[0], 0);     // I2C write
      txStr("...done.");
      break;
    case 0x02:
      txStr("\r\nGet IR Data");
      getIRData();
      iicSend(I2C_ADDR, TX_DATA[0], 0);     // I2C write
      iicSend(I2C_ADDR, 0, 1);              // I2C read
      txStr("\r\nIR Data:");
      for(x = 1; x < RX_DATA[0]; x++)
      {
        txStr(" ");
        txByte(RX_DATA[x]);
      }
      break;
    case 0x03:
      txStr("\r\n\nGet Last IR Value");
      getIRVal();
      iicSend(I2C_ADDR, TX_DATA[0], 0);     // I2C write
      iicSend(I2C_ADDR, 0, 1);              // I2C read
      txStr("\r\nIR Data:");
      for(x = 1; x < RX_DATA[0]; x++)
      {
        txStr(" ");
        txByte(RX_DATA[x]);
      }
      break;
    case 0x04:
      txStr("\r\n\nGet Port Pin State");
      getInputState();
      iicSend(I2C_ADDR, TX_DATA[0], 0);     // I2C write
      iicSend(I2C_ADDR, 0, 1);              // I2C read
      txStr("\r\nPort Pin:");
      for(x = 1; x < RX_DATA[0]; x++)
      {
        txStr(" ");
        txByte(RX_DATA[x]);
      }
      break;
    case 0x05:
      break;
    case 0x06:
      break;
    case 0x07:
      break;
    case 0x08:
      break;
    case 0x09:
      break;
    case 0x0A:
      break;
    case 0x0B:
      break;
    case 0x0C:
      break;
    case 0x0D:
      break;
    case 0x0E:
      break;
    case 0x0F:
      break;
  };
}


//
// UART1 RX Interrupt Service Routine
//
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_Rx_ISR(void)
{
  while( !(IFG2 & UTXIFG1) ){}              // Is USART1 TX buffer ready?
  TXBUF1 = RXBUF1 + 1;                      // Increment RXBUF1, copy to TXBUF1
}


//
// UART Function - transmit null-terminated string
//
void txStr(const char* pStr)
{
  unsigned int cnt = 0;

  for(; *pStr; ++pStr)
  {
    while (!(IFG2 & UTXIFG1))               // USART1 TX buffer ready?
    {
      if( ++cnt == UART_TX_RETRY )
      {
        return;
      }
    }
    TXBUF1 = *pStr;                         // Transmit character
  }
}

//
// UART Function - transmit byte as ASCII character
//
void txByte(unsigned char byte)
{
  unsigned char x;
  char str[3];

  str[0] = byte >> 4;
  str[1] = (byte & 0x0f);
  str[2] = 0;

  for(x = 0; x < 2; x++)
  {
    if( str[x] > 9 )
    {
      str[x] += 0x37;
    }
    else
    {
      str[x] += 0x30;
    }
  }

  txStr(str);
}


//
// UART Function - transmit word as ASCII characters
//
void txWord(unsigned int word)
{
  txByte(word >> 8);
  txByte(word & 0x00ff);
}


//
// I2C Message - Get RTC Parameters
//
void getRTC(void)
{
  TX_DATA[0] = 2;                           // Set message length
  TX_DATA[1] = GET_RTC_PARAMS;              // Set message ID
}


//
// I2C Message - Set RTC Parameters
//
void setRTC(void)
{
  TX_DATA[0] = 9;                           // Set message length
  TX_DATA[1] = SET_RTC_PARAMS;              // Set message ID
  TX_DATA[2] = 0x05;                        // Set year LSB (BCD)
  TX_DATA[3] = 0x20;                        // Set year MSB (BCD)
  TX_DATA[4] = 0x06;                        // Set month (BCD)
  TX_DATA[5] = 0x01;                        // Set day (BCD)
  TX_DATA[6] = 0x12;                        // Set hour (BCD)
  TX_DATA[7] = 0x00;                        // Set minute (BCD)
  TX_DATA[8] = 0x00;                        // Set second (BCD)
}


//
// I2C Message - Get IR Data
//
void getIRData(void)
{
  TX_DATA[0] = 2;                           // Set message length
  TX_DATA[1] = SEND_IR_DATA;                // Set message ID
}


//
// I2C Message - Get Last IR Value
//
void getIRVal(void)
{
  TX_DATA[0] = 2;                           // Set message length
  TX_DATA[1] = GET_LAST_IR_VALUE;           // Set message ID
}


//
// I2C Message - Get Port Pin Input State
//
void getInputState(void)
{
  TX_DATA[0] = 2;                           // Set message length
  TX_DATA[1] = GET_INPUT_STATE;             // Set message ID
}


//
// I2C Message - Get Event
//
void getEvent(void)
{
  TX_DATA[0] = 2;                           // Set message length
  TX_DATA[1] = GET_EVENT;                   // Set message ID
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -