📄 triton_i2c.c
字号:
//===============================================================================
// 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 + -