中级会员
- 积分
- 342
- 威望
- 173
- 贡献
- 125
- 兑换币
- 112
- 注册时间
- 2012-12-10
- 在线时间
- 22 小时
- 毕业学校
- 哈工程
|
2#
楼主 |
发表于 2014-3-7 20:41:16
|
只看该作者
此楼贴程序
IIC.c
#include "common.h"
#include "IIC.h"
//****************************
//IIC初始化函数
//****************************
void IIC_init( u8 MoudleNum )
{
I2C_MemMapPtr num = IIC_get_base_address( MoudleNum ); //获取iic模块地址
if( num == I2C0 )
{
SIM_SCGC4 |= SIM_SCGC4_I2C0_MASK; //打开I2C0模块时钟;
//配置引脚复用为I2C0功能
PORTD_PCR9 = PORT_PCR_MUX( 2 ); //i2c SCL 使用PTD8
PORTD_PCR8 = PORT_PCR_MUX( 2 ); //i2c SDA 使用PTD9
I2C0_F = 0x65; //分频?
I2C0_C1 = I2C_C1_IICEN_MASK | I2C_C1_TXAK_MASK; //使能I2C,不发送应答信号
}
else
{
SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK; //打开I2C1模块时钟;
//配置引脚复用为I2C0功能
PORTC_PCR10 = PORT_PCR_MUX( 2 ); //i2c SCL 使用PTC10
PORTC_PCR11 = PORT_PCR_MUX( 2 ); //i2c SCL 使用PTC10
I2C1_F = 0x65; //分频?
I2C1_C1 = I2C_C1_IICEN_MASK | I2C_C1_TXAK_MASK; //使能I2C,不发送应答信号
}
}
//*************************************
//根据需要产生开始或停止信号
//参数 :MoudleNum模块号 Signal:'S'开始 'O'结束
//BY ZYQ 2014.3.6
//*************************************
void send_signal( u8 Signal , u8 MoudleNum )
{
I2C_MemMapPtr num = IIC_get_base_address( MoudleNum ); //获取i2c模块地址
if( num == I2C0 )
{
if( Signal == 'S' )
{ IIC0_Start(); }
else if ( Signal == 'O' )
{ IIC0_Stop(); }
}
else if ( num == I2C1 )
{
if( Signal == 'S' )
{ IIC1_Start(); }
else if ( Signal == 'O' )
{ IIC1_Stop(); }
}
}
//***************************************
//作用 :在有限时间内,循环检测接受应答标志位,或传送完成标志位,判断MCU是否接受到应答信号或
// 一个字节是否已在总线上传输完毕
//参数 :MoudleNum模块号 ,
// x x:'A'等待应答; 'T'等待一个字节数据传输完成
//BY ZYQ 2014.3.6
//***************************************
u8 IIC_wait( u8 x , u8 MoudleNum )
{
u16 ErrTime , i ;
I2C_MemMapPtr num = IIC_get_base_address( MoudleNum );
ErrTime = 255*10; //定义查询超时时限
for( i = 0 ; i < ErrTime ; i++ )
{
if( x == 'A' )
{
if( (I2C_S_REG(num) & I2C_S_RXAK_MASK) == 0 )
return 0;
}
else if( x == 'T' )
{
if( (I2C_S_REG(num) & I2C_S_IICIF_MASK) != 0 )
{
return 0;
}
}
}
if( i >= ErrTime )
return 1;
}
//**************************************
//从从机读1字节
//参数 : u8 MoudleNum 模块号
// u8 DeviceAddr 设备地址
// u8 Accessaddr 访问地址
// u8 *Data 带收到的1字节数据
//返回 : 0 成功 1 失败
//BY ZYQ 2012.3.6
//**************************************
u8 IIC_read1( u8 MoudleNum , u8 DeviceAddr , u8 AccessAddr , u8 *Data )
{
I2C_MemMapPtr num = IIC_get_base_address( MoudleNum );
I2C_C1_REG( num ) |= 0x10;
send_signal( 'S' , MoudleNum );
I2C_D_REG( num ) = DeviceAddr & 0xfe ;
if( IIC_wait( 'T' , MoudleNum ) )
{ return 1 ; }
if( IIC_wait( 'A' , MoudleNum ) )
{ return 1 ; }
I2C_D_REG( num ) = AccessAddr;
if( IIC_wait( 'T' , MoudleNum ) )
{ return 1 ; }
if( IIC_wait( 'A' , MoudleNum ) )
{ return 1 ; }
I2C_C1_REG( num ) |= 0x04 ;
I2C_D_REG( num ) = DeviceAddr | 0x01 ;
if( IIC_wait( 'T' , MoudleNum ) )
{ return 1 ; }
if( IIC_wait( 'A' , MoudleNum ) )
{ return 1 ; }
I2C_C1_REG( num ) &= 0xfe;
*Data = I2C_D_REG( num );
if( IIC_wait( 'T' , MoudleNum ) )
{ return 1 ; }
send_signal( 'O' , MoudleNum );
*Data = I2C_D_REG( num );
return 0;
}
//*********************************************
//向从机写一字节
//参数 : u8 MoudleNum 模块号
// u8 DeviceAddr 设备地址
// u8 Accessaddr 访问地址
// u8 *Data 带收到的1字节数据
//返回 0 成功 1失败
//BY ZYQ 2014.3.6
//*********************************************
u8 IIC_write1( u8 MoudleNum , u8 DeviceAddr , u8 AccessAddr , u8 Data )
{
I2C_MemMapPtr num = IIC_get_base_address( MoudleNum );
I2C_C1_REG( num ) |= 0x10 ;
send_signal( 'S' , MoudleNum );
I2C_D_REG( num ) = DeviceAddr & 0xfe ;
if( IIC_wait( 'T' , MoudleNum ) )
{ return 1 ; }
if( IIC_wait( 'A' , MoudleNum ) )
{ return 1 ; }
I2C_D_REG( num ) = AccessAddr;
if( IIC_wait( 'T' , MoudleNum ) )
{ return 1 ; }
if( IIC_wait( 'A' , MoudleNum ) )
{ return 1 ; }
I2C_D_REG( num ) = Data ;
if( IIC_wait( 'T' , MoudleNum ) )
{ return 1 ; }
if( IIC_wait( 'A' , MoudleNum ) )
{ return 1 ; }
send_signal( 'O' , MoudleNum );
return 0 ;
}
//***************************
//从从机读N个字节
//***************************
u8 IIC_readN( u8 MoudleNum , u8 DeviceAddr , u8 AccessAddr , u8 Data[] , u8 N )
{
u16 i,j;
for ( i=0 ; i<N ; i++ )
{
for( j=0 ; j<15*40 ; j++ )
if( IIC_read1( MoudleNum , DeviceAddr , AccessAddr+i , &Data[i] ) )
return 1;
}
if( i>=N )
return 0;
}
//***************************
//向写机读N个字节
//***************************
u8 IIC_writeN( u8 MoudleNum , u8 DeviceAddr , u8 AccessAddr , u8 Data[] , u8 N )
{
u16 i,j;
for ( i=0 ; i<N ; i++ )
{
for( j=0 ; j<15*40 ; j++ )
if( IIC_write1( MoudleNum , DeviceAddr , AccessAddr+i , Data[i] ) )
return 1;
}
if( i>=N )
return 0;
}
//***************************
//获取I2C地址函数
//***************************
I2C_MemMapPtr IIC_get_base_address( u8 MoudleNum )
{
switch( MoudleNum )
{
case 0 :
return I2C0_BASE_PTR; break;
case 1 :
return I2C1_BASE_PTR; break;
}
} |
|