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

📄 i2c.c

📁 基于瑞萨 M16C 的最新版本 IIC 通信
💻 C
📖 第 1 页 / 共 2 页
字号:
  UiMR    = 0x02;   // Enable IIC mode, internal clock
  UiC1    = 0x10;   // Transmit/Receive disable
  UiSMR2  = 0x02;   // UART init. disable,Clock sync. enable
  UiSMR4  = 0x71;   // Start condition generate (STSPSEL=0/STAREQ=1)
  UiSMR4  = 0x09;   // STSP output enable (STSPSEL=1/STAREQ=1)
  return TRUE;
}
// ---------------------------------------------------------------------------
// Adjust bus speed of I睠 line
// Uses defines : I2C_75_KB_SPEED ==> I2C_400_KB_SPEED
// ---------------------------------------------------------------------------
// Input Parameters :
// 1- Baud rate
// ---------------------------------------------------------------------------
// Returned Parameters :
// TRUE or FALSE if data can be transmited
// ---------------------------------------------------------------------------
// Modified globales: None
// ---------------------------------------------------------------------------
void I2C_setSpeed(unsigned char baudRate)
{
    UiBRG = baudRate;
}
// ---------------------------------------------------------------------------
// DMA1 Interrupt
// Uses defines :
// ---------------------------------------------------------------------------
// Input Parameters :     None
// ---------------------------------------------------------------------------
// Returned Parameters :  None
// ---------------------------------------------------------------------------
// Modified globales:     None
// ---------------------------------------------------------------------------
#ifdef DMA1_USED
void DMA_interrupt(void){
  if(slaveAddress.bit.rw==0)//Write mode ?
  {
    //Last data send, with ack ?
    ACK_IC = RX_ACK_IPL;    // ACK int. enable
    DM1IC.BYTE = INT_DISABLE;   //Disable DMA1 Interrupt
  }

}
#endif
// ---------------------------------------------------------------------------
// UARTi ACK interrupt
// Uses defines :
// ---------------------------------------------------------------------------
// Input Parameters :     None
// ---------------------------------------------------------------------------
// Returned Parameters :  None
// ---------------------------------------------------------------------------
// Modified globales:
// currentStatus
// ---------------------------------------------------------------------------
void I2C_ACK(void)
{

  if(slaveAddress.bit.rw==1)  //Read mode ?
    {
    if(readIndex!=0)      //Address in receive register if readIndex==0
      {
      ptrReadData[readIndex-1] = (unsigned char)UiRB;
      }
    readIndex++;
    //Continue transmission with FF (keep bus high)
    if(readIndex==totalReadLength)//is next data last byte ?
      UiTB = 0x01FF;    // send NACK
    else
      UiTB = 0x00FF;    // send ACK
    }
  else
    {
      if(writeIndex != writeLength) //Sent all bytes ?
        {
        UiTB = ptrWriteData[writeIndex];
        writeIndex++;
        }
      else
        {
        //Continue transmission with FF (keep bus high)
        if(writeIndex==writeLength)//is next data last byte ?
        //This portion is generated ONLY on last data Transmit
        UiSMR4 = 0x74;    // SCL=SDA="H"
        UiSMR4 = 0x0C;    // Stop condition (STSPSEL=1/STPREQ=1)
        }
    }
}
// ---------------------------------------------------------------------------
// UARTi NACK interrupt
// Uses defines :
// ---------------------------------------------------------------------------
// Input Parameters :     None
// ---------------------------------------------------------------------------
// Returned Parameters :  None
// ---------------------------------------------------------------------------
// Modified globales:
// currentStatus
// ---------------------------------------------------------------------------
void I2C_NACK(void)
{
currentStatus.bit.nack = TRUE;
  UiSMR4 = 0x74;    // SCL=SDA="H"
  UiSMR4 = 0x0C;    // Stop condition (STSPSEL=1/STPREQ=1)
  ACK_IC = INT_DISABLE;  // ACK int. disable
#ifdef  DMA1_USED
  DM1CON.BYTE = 0;           // DMA1 disable (stop data transmission)
  DM1IC.BYTE = INT_DISABLE; //Disable DMA1 Interrupt
#endif
  if(slaveAddress.bit.rw==1)//Read mode ?
    {
    if(readIndex!=totalReadLength)
      // Received NACK before end of reception.
      currentStatus.bit.error = I2C_UNCOMPLETE_READ;
    else
      {
      // Get last byte in receive buffer
      ptrReadData[readIndex-1] = (unsigned char)UiRB;
      }
    }
  else
    {
    // Illegal condition
    currentStatus.bit.error = I2C_UNCOMPLETE_WRITE;
    }
}
// ---------------------------------------------------------------------------
// UARTi Start / Stop Interrupt
// Uses defines :
// ---------------------------------------------------------------------------
// Input Parameters :    None
// ---------------------------------------------------------------------------
// Returned Parameters : None
// ---------------------------------------------------------------------------
// Modified globales:
// currentStatus
// ---------------------------------------------------------------------------
void I2C_StartStopDetection(void)
{
  unsigned short temp = 0;

  if(BusBusyFlag == 1)
    { // Start condition interrupt
    UiC1 = 0x10;    // Transfer/Receive enable
    UiC1 = 0x15;    // Transfer/Receive enable
    UiMR = 0x02;
    UiSMR4 = 0x00;  // STSPSEL=0
    temp = slaveAddress.byte; // Slave address set
    temp |= 0x0100; // NACK data set
    UiTB = temp;    // Start 1st byte transfer
    UiRB = 0;       // Arbitration lost flag clear
    NACK_IC = TX_NACK_IPL;   // NACK interrupt
#ifdef DMA1_USED
    if(slaveAddress.bit.rw==1)//Read mode ?
      ACK_IC  = RX_ACK_IPL;    // ACK interrupt
#else
    ACK_IC  = RX_ACK_IPL;    // ACK interrupt
#endif
    }
  else
    { // Stop condition interrupt
    UiMR = 0x00; 	// port set(Purpose:TXFUL,TBFUL flag must be cleared when
  // slave receive)
    UiMR    = 0x0a; 	  // ext. clock sel
    UiSMR2  = 0x10; 	  //
    UiSMR4  = 0x30; 	  // ACK data output"H"
    UiC1    = 0x15; 	  // transfer/receive enable
    ACK_IC  = INT_DISABLE;
    NACK_IC = INT_DISABLE;
    if(currentStatus.bit.busy==TRUE)
      {
      currentStatus.bit.busy=FALSE;
      }
    }
}
// ---------------------------------------------------------------------------
// Get I睠 line status
// Uses defines
// ---------------------------------------------------------------------------
// Input Parameters : None
// ---------------------------------------------------------------------------
// Returned : I睠 status
// ---------------------------------------------------------------------------
// Modified globales: None
// ---------------------------------------------------------------------------
I2CStatus I2C_getStatus()
{
  return currentStatus;
}

⌨️ 快捷键说明

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