📄 msi2c.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 : 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 + -