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

📄 msi2c.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
//===============================================================================
//            TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION
//
//   Property of Texas Instruments
//   For  Unrestricted  Internal  Use  Only
//   Unauthorized reproduction and/or distribution is strictly prohibited.
//   This product is protected under copyright law and trade secret law
//   as an unpublished work.
//   Created 2000, (C) Copyright 2000 Texas Instruments.  All rights reserved.
//
//   Filename           : msi2c.c
//
//   Description        : I2C Multi-Master functions
//
//   Project            : Neptune
//
//   Author             : Jean-Baptiste Denis (from f-delmarco@ti.com)
//
//   Date of Module Modification:6/5/01
//   Date of Generation :6/5/01
//
//===============================================================================



#include "global_types.h"
#include "msi2c.h"


volatile BOOL I2C_Ardy;    // indicates I2C ARDY interrupt has been acknowledge by ARM

//---------------------------------------------------------------------
// NAME        : MSI2C_reset
//
// DESCRIPTION : clears basic registers (Configuration, counter, DMA, IE)
//
// PARAMETERS  : MSI2C base address
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------


void MSI2C_reset(UWORD32 msi2c_base_address)
{
  ClearBit(MSI2C_I2C_CON_16_0(msi2c_base_address),0xCF03); // Reset + clear CONFIG Reg.
  ClearBit(MSI2C_I2C_CNT_16_0(msi2c_base_address),0xFFFF); // Clear data counter Reg.
  ClearBit(MSI2C_I2C_BUF_16_0(msi2c_base_address),0x8080); // Clear DMA Reg.
  ClearBit(MSI2C_I2C_IE_16_0(msi2c_base_address), 0x003F); // Clear IE Reg.
}


//---------------------------------------------------------------------
// NAME        : MSI2C_FullReset
//
// DESCRIPTION : Resets I2C
//
// PARAMETERS  : MSI2C base address
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------

void MSI2C_FullReset(UWORD32 msi2c_base_address)
{
  // Reset module
  MSI2C_I2C_SYSC_16_0(msi2c_base_address) = 0x2;

  // enable module (set I2C_CON's I2C_EN field to 1) 
  MSI2C_I2C_CON_16_0(msi2c_base_address) |= 0x8000;
  while(GetGroupBits16(MSI2C_I2C_SYSS_16_0(msi2c_base_address), 0, 1) == 0);
}


//---------------------------------------------------------------------
// NAME        : ResetDoneTest
//
// DESCRIPTION : Indicates if MSI2C reset has been done
//
// PARAMETERS  : MSI2C base address
//
// RETURN VALUE: 0 if reset done, else EE00
//
// LIMITATIONS : 
//---------------------------------------------------------------------

UWORD16 ResetDoneTest(UWORD32 msi2c_base_address)
{
  int count;
  
  count = 100; // timeout value
  while((MSI2C_I2C_SYSS_16_0(msi2c_base_address) == 0) AND (count > 1))
    count--;

  if(count < 2)
    return 1;
  else
    return 0;
}


//---------------------------------------------------------------------
// NAME        : MSI2C_Timing
//
// DESCRIPTION : Sets I2C clock prescaler and High and Low timings
//
// PARAMETERS  : MSI2C base address
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------

void MSI2C_Timing(UWORD32 msi2c_base_address)
{
  MSI2C_I2C_PSC_16_0(msi2c_base_address) |= 0x0000;

  // 464KHz clock frequency with Prescaler set to 0
  MSI2C_I2C_SCLL_16_0(msi2c_base_address) |= 0x00008;
  MSI2C_I2C_SCLH_16_0(msi2c_base_address) |= 0x00008;
}


//---------------------------------------------------------------------
// NAME        : MSI2C_ConfIntrruptRxMaster
//
// DESCRIPTION : Configures MSI2C for Rx data transfer with interrupts
//
// PARAMETERS  : MSI2C base address, Own Address, Slave Address, Number of Bytes to receive
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------

void MSI2C_ConfIntrruptRxMaster(UWORD32 msi2c_base_address, UWORD16 OwnAddress, UWORD16 SlaveAddress, UWORD16 NbOfBytes)
{
  MSI2C_reset(msi2c_base_address);

  //--> set own address
  SetGroupBits16(MSI2C_I2C_OA_16_0(msi2c_base_address),0,10, OwnAddress);

  //--> enable module
  MSI2C_I2C_CON_16_0(msi2c_base_address) |= 0x8000;

  while(MSI2C_I2C_SYSS_16_0(msi2c_base_address) != 1);  // Wait reset-done

  //--> set  Slave address
  SetGroupBits16(MSI2C_I2C_SA_16_0(msi2c_base_address),0,10, SlaveAddress);

  //--> setup NbOfBytes bytes transfer
  SetGroupBits16(MSI2C_I2C_CNT_16_0(msi2c_base_address),0,16, NbOfBytes);

  //==> enable RRDY + ARDY + AL interrupts
  SetGroupBits16(MSI2C_I2C_IE_16_0(msi2c_base_address),0,6,0xD);  

  //--> Master RX
  SetGroupBits16(MSI2C_I2C_CON_16_0(msi2c_base_address),9,2,2);
}


//---------------------------------------------------------------------
// NAME        : MSI2C_StartIntrruptRxmaster
//
// DESCRIPTION : MSI2C Rx transfer with interrupts
//
// PARAMETERS  : MSI2C base address
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------

void MSI2C_StartIntrruptRxMaster(UWORD32 msi2c_base_address)
{
  while(GetGroupBits16(MSI2C_I2C_STAT_16_0(msi2c_base_address), 12, 1) != 0);  // Wait BB = 0

  //--> Master RX
  SetGroupBits16(MSI2C_I2C_CON_16_0(msi2c_base_address),9,2,2);

  I2C_Ardy = False;

  // start transmission	
  MSI2C_I2C_CON_16_0(msi2c_base_address) |= 0x0003;

  // wait Access Ready Interrupt
  while (I2C_Ardy != True);

}



//---------------------------------------------------------------------
// NAME        : MSI2C_ConfIntrruptTxMaster
//
// DESCRIPTION : Configures MSI2C for Tx data transfer with interrupts
//
// PARAMETERS  : MSI2C base address,  Own Address, Slave Address, Number of Bytes to receive
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------

void MSI2C_ConfIntrruptTxMaster(UWORD32 msi2c_base_address, UWORD16 OwnAddress, UWORD16 SlaveAddress, UWORD16 NbOfBytes)
{
  MSI2C_reset(msi2c_base_address); 
  
  //--> set own address
  SetGroupBits16(MSI2C_I2C_OA_16_0(msi2c_base_address),0,10, OwnAddress);
  
  //--> enable module 
  MSI2C_I2C_CON_16_0(msi2c_base_address) |= 0x8000;
  while(MSI2C_I2C_SYSS_16_0(msi2c_base_address) != 1);  // Wait reset-done
     
  //--> set  Slave address
  SetGroupBits16(MSI2C_I2C_SA_16_0(msi2c_base_address),0,10,SlaveAddress);
  
  //--> setup NbOfBytes bytes transfer 
  SetGroupBits16(MSI2C_I2C_CNT_16_0(msi2c_base_address),0,16, NbOfBytes); 
 
  //==> enable XRDY + ARDY + AL interrupts
  SetGroupBits16(MSI2C_I2C_IE_16_0(msi2c_base_address),0,6,0x15);
 
 //--> master TX 
  SetGroupBits16(MSI2C_I2C_CON_16_0(msi2c_base_address),9,2,3);
}


//---------------------------------------------------------------------
// NAME        : SI2C_StartIntrruptTxMaster
//
// DESCRIPTION : MSI2C Tx transfer with interrupts
//
// PARAMETERS  : MSI2C base address
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------

void MSI2C_StartIntrruptTxMaster (UWORD32 msi2c_base_address)
{
  while(GetGroupBits16(MSI2C_I2C_STAT_16_0(msi2c_base_address), 12, 1) != 0);  // Wait BB = 0

  //--> master TX 
  SetGroupBits16(MSI2C_I2C_CON_16_0(msi2c_base_address),9,2,3);

  I2C_Ardy = False;

  // start transmission	
  MSI2C_I2C_CON_16_0(msi2c_base_address) |= 0x0003;

  // wait Access Ready Interrupt
  while (I2C_Ardy != True);

}


//---------------------------------------------------------------------
// NAME        : MSI2C_ConfIntrruptTxSlave
//
// DESCRIPTION : Configures MSI2C for Tx Slave data transfer with interrupts
//
// PARAMETERS  : MSI2C base address, Own Address, Slave Address, Number of Bytes to transmit
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------

void MSI2C_ConfIntrruptTxSlave (UWORD32 msi2c_base_address, UWORD16 OwnAddress, UWORD16 SlaveAddress, UWORD16 NbOfBytes)
{
  MSI2C_reset(msi2c_base_address);

  //--> set own address
  SetGroupBits16(MSI2C_I2C_OA_16_0(msi2c_base_address),0,10, OwnAddress);

  //--> enable module
  MSI2C_I2C_CON_16_0(msi2c_base_address) |= 0x8000;
  while(MSI2C_I2C_SYSS_16_0(msi2c_base_address) != 1);  // Wait reset-done

  //--> set  Slave address
  SetGroupBits16(MSI2C_I2C_SA_16_0(msi2c_base_address),0,10, SlaveAddress);

  //--> setup NbOfBytes bytes transfer
  SetGroupBits16(MSI2C_I2C_CNT_16_0(msi2c_base_address),0,16, NbOfBytes);

  //==> enable XRDY + ARDY + AL interrupts
  SetGroupBits16(MSI2C_I2C_IE_16_0(msi2c_base_address),0,6,0x15);

  //--> Slave TX 
  SetGroupBits16(MSI2C_I2C_CON_16_0(msi2c_base_address),9,2,1);
}


//---------------------------------------------------------------------
// NAME        : MSI2C_ConfIntrruptRxSlave
//
// DESCRIPTION : Configures MSI2C for Rx Slave data transfer with interrupts
//
// PARAMETERS  : MSI2C base address, Own Address, Slave Address, Number of Bytes to transmit
//
// RETURN VALUE: None
//
// LIMITATIONS : 
//---------------------------------------------------------------------

void MSI2C_ConfIntrruptRxSlave (UWORD32 msi2c_base_address, UWORD16 OwnAddress, UWORD16 SlaveAddress, UWORD16 NbOfBytes)
{
  MSI2C_reset(msi2c_base_address);

⌨️ 快捷键说明

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