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

📄 triton_i2c.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 C
📖 第 1 页 / 共 3 页
字号:
//===============================================================================
//            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           : triton_i2c.c
//
//   Description        : I2c module for Abb communication
//
//   Project            : Neptune
//
//   Author             : Bruno Decroos
//
//  
//   Date of Generation :6/5/2004
//
//===============================================================================



#include "global_types.h"
#include "mapping.h"
#include "triton_mapping.h"
#include "mem.h"
#include "msi2c.h"

extern UWORD8 nack_count;            // No acknoledgment interrupt counter of the I2c bus
extern UWORD8 arbit_lost_count;      // Arbitration lost interrupt counter of the I2c bus
extern UWORD8 rrdy_count;            // Receive data ready interrupt counter of the I2c bus
extern UWORD8 xrdy_count;            // Transmit data ready interrupt counter of the I2c bus
extern UWORD8 flag_receive_end;      // Register access ready when reception of the I2c bus
extern UWORD8 flag_transmit_end;     // Register access ready when transmitter of the I2c bus

extern UWORD16 AbbDeviceAddress ;    // device address used for the I2c communication
extern UWORD8  Abb_page_in_use  ;    // Abb Page selection
UWORD8 data16_to_send_nb_int; // number of bytes to be sent for tests using interrupts  
UWORD16  ReadData16_int;      // Triton returned register value for tests using receive ready interrupt

#define LIMIT_CYCLENUMB 500
//---------------------------------------------------------------------
// NAME        :  MSI2C_InitConnectionAbb
//
// DESCRIPTION : Init module I2C Interface for Abb connection
//               Set transfert to 400kbits/s
//
// PARAMETERS  : none
//             
//
// RETURN VALUE: none
//              
//
// LIMITATIONS : None
//---------------------------------------------------------------------
void MSI2C_InitConnectionGPIO(void) 
{

  UWORD16 own_adress = 0x40  ; // own_address, I2c address for Neptune

  // Reset module
  MSI2C_I2C_SYSC_16_0(MSI2C_1_BASE_ADDR_ARM) = 0x2;

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

  //Set tranfert to 303 kbits/s
  MSI2C_SCLL(MSI2C_1_BASE_ADDR_ARM) =0x0b;  
  MSI2C_SCLH(MSI2C_1_BASE_ADDR_ARM) =0x0b;

  //configure own slave adress 
  MSI2C_OAR(MSI2C_1_BASE_ADDR_ARM) = own_adress;
//    //..//
}

//---------------------------------------------------------------------
// NAME        :  MSI2C_InitConnectionAbb
//
// DESCRIPTION : Init module I2C Interface for Abb connection
//               Set transfert to 400kbits/s
//
// PARAMETERS  : none
//             
//
// RETURN VALUE: none
//              
//
// LIMITATIONS : None
//---------------------------------------------------------------------
void MSI2C_InitConnectionAbb(void) 
{

  UWORD16 own_adress = 0x40  ; // own_address, I2c address for Neptune

  // Reset module
  MSI2C_I2C_SYSC_16_0(MSI2C_1_BASE_ADDR_ARM) = 0x2;

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

  //Set tranfert to 406 kbits/s
  MSI2C_SCLL(MSI2C_1_BASE_ADDR_ARM) =0x09;  
  MSI2C_SCLH(MSI2C_1_BASE_ADDR_ARM) =0x09;

  //configure own slave adress 
  MSI2C_OAR(MSI2C_1_BASE_ADDR_ARM) = own_adress;

}

//---------------------------------------------------------------------
// NAME        : MSI2C_MasterPollingSendGenCallAbb
//
// DESCRIPTION : Custom General Call access to change the Abb I2c device address of Abb
//
// PARAMETERS  : UWORD8         register_adress  : 7bit slave device address (NOTE : Fill MSB bits with 0)
//
// RETURN VALUE: err_none
//               err_NACK_STAT
//
// LIMITATIONS : None
//---------------------------------------------------------------------
void MSI2C_MasterPollingSendGenCallAbb ( UWORD8 new_device_adress)
{
  //  UWORD16 msi2c_stat_save;
  UWORD16 slave_adress = 0x00; // triton general call slave address
  UWORD8  data_number =     4; // number of byte data to tramsmit when I2c write access to Abb
  UWORD16 wait;
  UWORD16 count;
  UWORD16 data16;
  UWORD8  register_adress; 
     
  //configure the number of data to send
  MSI2C_CNT(MSI2C_1_BASE_ADDR_ARM)= data_number;

  //configure slave_adress
  MSI2C_SAR(MSI2C_1_BASE_ADDR_ARM)= slave_adress;

  wait = 0;
  
  //wait for bus free
  while(   (wait < LIMIT_CYCLENUMB) &&  ( MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_BB_MASK))
  {
    wait++;
  } 
  // Start transmission 
  //configuration of i2c transmission : master , tranmit, no repeat, stop bit and start bit
  MSI2C_CON(MSI2C_1_BASE_ADDR_ARM) = 0x8603; //I2C_EN=1,BE = 0,STB= 0, MST = 1 , TRX = 1 , XA= 0 , RM = 0 , STP = 1, STT = 1


  wait = 0;
  count = 0 ;

  while( wait < LIMIT_CYCLENUMB  )
    {
      wait++;
      if(( MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_NACK_MASK) == 0x00)
	{
	  if ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_ARDY_MASK) == 0x00 )
	    {
	      if ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_XRDY_MASK) == MSI2C_STAT_XRDY_MASK) 
		{
		  if (  count == 0) 
		    {
                      //data16 = 0x7717;
                      data16 = AbbPartNumber;
		      MSI2C_DATA(MSI2C_1_BASE_ADDR_ARM) =  (UWORD16) data16 ;
		      count += 2;
		    }
		  else
		    {
                      //data16 = 0x0000;
                      data16 = ManufacturerId;
                      MSI2C_DATA(MSI2C_1_BASE_ADDR_ARM)  = ( ((UWORD16 ) data16 ) | (((UWORD16 )new_device_adress)<<8));
		      count += 2;
		    }		  
		  MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) &= MSI2C_STAT_XRDY_MASK;

		}
	    }
	}
    
      if((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_ARDY_MASK) == MSI2C_STAT_ARDY_MASK)
	{                  
	  // End of transmission 
	  MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) &= MSI2C_STAT_ARDY_MASK;
       	  return;          
	}
    }  // while

}


//---------------------------------------------------------------------
// NAME        : MSI2C_MasterPollingSendAbb
//
// DESCRIPTION : data transfert of one data (for 8 bits register) to Abb
//
// PARAMETERS  : UWORD8         register_adress  : 7bit slave device address (NOTE : Fill MSB bits with 0)
//               UWORD8         data8            : data 8bits. 
//
// RETURN VALUE: err_none
//               err_NACK_STAT
//
// LIMITATIONS : None 
//---------------------------------------------------------------------
void MSI2C_MasterPollingSendAbb ( UWORD8 register_adress,
				  UWORD8 data8)
{
  UWORD16 msi2c_stat_save;
  UWORD16 slave_adress = AbbDeviceAddress; // triton slave address
  UWORD8  data_number = 2;                 // number of byte data to tramsmit when I2c write access to Abb
  UWORD16 data16;
  UWORD16 wait;
 
 

  data16 = ( ((UWORD16 )register_adress) | (((UWORD16 )data8)<<8));
     
  //configure the number of data to send
  MSI2C_CNT(MSI2C_1_BASE_ADDR_ARM)= data_number;

  //configure slave_adress
  MSI2C_SAR(MSI2C_1_BASE_ADDR_ARM)= slave_adress;

  wait = 0;
  
  //wait for bus free
  while(   (wait < LIMIT_CYCLENUMB) &&  ( MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_BB_MASK))
  {
    wait++;
  } 

  // Start transmission 
  //configuration of i2c transmission : master , tranmit, no repeat, stop bit and start bit
  MSI2C_CON(MSI2C_1_BASE_ADDR_ARM) = 0x8603; //I2C_EN=1,BE = 0,STB= 0, MST = 1 , TRX = 1 , XA= 0 , RM = 0 , STP = 1, STT = 1


  wait = 0;
  while( wait < LIMIT_CYCLENUMB  )
    {
      wait++;
      if(( MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_NACK_MASK) == 0x00)
	{
	  if ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_ARDY_MASK) == 0x00 )
	    {
	      if ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_XRDY_MASK) == MSI2C_STAT_XRDY_MASK) 
		{
		  MSI2C_DATA(MSI2C_1_BASE_ADDR_ARM) = data16;
	          MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) &= MSI2C_STAT_XRDY_MASK;
		}
	    }
	}
    
      if((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_ARDY_MASK) == MSI2C_STAT_ARDY_MASK)
	{                  
	  // End of transmission 
	  MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) &= MSI2C_STAT_ARDY_MASK;
	  return;          
	}
    }  // while

}

//ahuo

void MSI2C_MasterPollingSend ( UWORD8 DeviveAddress, UWORD8 register_adress,
				  UWORD8 data8)
{
  UWORD16 msi2c_stat_save;
  UWORD16 slave_adress = DeviveAddress;//AbbDeviceAddress; // triton slave address
  UWORD8  data_number = 2;                 // number of byte data to tramsmit when I2c write access to Abb
  UWORD16 data16;
  UWORD16 wait;
 
 

  data16 = ( ((UWORD16 )register_adress) | (((UWORD16 )data8)<<8));
     
  //configure the number of data to send
  MSI2C_CNT(MSI2C_1_BASE_ADDR_ARM)= data_number;

  //configure slave_adress
  MSI2C_SAR(MSI2C_1_BASE_ADDR_ARM)= slave_adress;

  wait = 0;
  
  //wait for bus free
  while(   (wait < LIMIT_CYCLENUMB) &&  ( MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_BB_MASK))
  {
    wait++;
  } 

  // Start transmission 
  //configuration of i2c transmission : master , tranmit, no repeat, stop bit and start bit
  MSI2C_CON(MSI2C_1_BASE_ADDR_ARM) = 0x8603; //I2C_EN=1,BE = 0,STB= 0, MST = 1 , TRX = 1 , XA= 0 , RM = 0 , STP = 1, STT = 1


  wait = 0;
  while( wait < LIMIT_CYCLENUMB  )
    {
      wait++;
      if(( MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_NACK_MASK) == 0x00)
	{
	  if ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_ARDY_MASK) == 0x00 )
	    {
	      if ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_XRDY_MASK) == MSI2C_STAT_XRDY_MASK) 
		{
		  MSI2C_DATA(MSI2C_1_BASE_ADDR_ARM) = data16;
	          MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) &= MSI2C_STAT_XRDY_MASK;
		}
	    }
	}
    
      if((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_ARDY_MASK) == MSI2C_STAT_ARDY_MASK)
	{                  
	  // End of transmission 
	  MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) &= MSI2C_STAT_ARDY_MASK;
	  return;          
	}
    }  // while

}

//ahuo
//---------------------------------------------------------------------
// NAME        : MSI2C_MasterPollingReceiveAbb
//
// DESCRIPTION :  data read of one data (for 8 bits register) from Abb
//
// PARAMETERS  : UWORD8 register_adress : 7bit slave device adress (NOTE : Fill MSB bits with 0)
//              
//
// RETURN VALUE: data read
//               Error
//
// LIMITATIONS : None
//---------------------------------------------------------------------

 
UWORD8 MSI2C_MasterPollingReceiveAbb(UWORD8 register_adress)
{
 
  UWORD16 slave_adress = AbbDeviceAddress; // triton slave address
  UWORD16 data_number = 1;                 // number of byte data to tramsmit when I2c write access to Abb
  UWORD16 data16;
  UWORD8  ReadData;
  UWORD16 wait;
 
 
  //data16 = ( ((UWORD16 )register_adress) | (((UWORD16 )data8)<<8));
  data16  = ((UWORD16 )register_adress);
  
  //data_number 
  MSI2C_CNT(MSI2C_1_BASE_ADDR_ARM)= data_number;

  //configure slave_adress
  MSI2C_SAR(MSI2C_1_BASE_ADDR_ARM) = slave_adress;
 
  wait = 0;

  //wait for bus free
  while( (wait < LIMIT_CYCLENUMB) &&  (MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_BB_MASK))
  {
    wait++;
  } 

  // Start transmission 

  // 1 st part: write. 1 st part: write. 1 st part: write. 1 st part: write. 1 st part: write.

  //configuration of i2c transmission : master , Receive, no repeat, no stop bit and start bit
  MSI2C_CON(MSI2C_1_BASE_ADDR_ARM) = 0x8601; //I2C_EN=1,BE = 0,STB= 0, MST = 1 , TRX = 0 , XA= 0 , RM = 0 , STP = 0, STT = 1

  while( (wait < LIMIT_CYCLENUMB) &&  ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_ARDY_MASK) != MSI2C_STAT_ARDY_MASK) )
    {
      wait++;
      if(( MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_NACK_MASK) == 0x00)
	{
	  if ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_ARDY_MASK) == 0x00 )
	    {
	      if ((MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) & MSI2C_STAT_XRDY_MASK) == MSI2C_STAT_XRDY_MASK) 
		{
		  MSI2C_DATA(MSI2C_1_BASE_ADDR_ARM) = data16;
 	          MSI2C_STAT(MSI2C_1_BASE_ADDR_ARM) &= MSI2C_STAT_XRDY_MASK;
		}
	    }

⌨️ 快捷键说明

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