TWI例程.docx

上传人:b****8 文档编号:23867534 上传时间:2023-05-21 格式:DOCX 页数:12 大小:16.93KB
下载 相关 举报
TWI例程.docx_第1页
第1页 / 共12页
TWI例程.docx_第2页
第2页 / 共12页
TWI例程.docx_第3页
第3页 / 共12页
TWI例程.docx_第4页
第4页 / 共12页
TWI例程.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

TWI例程.docx

《TWI例程.docx》由会员分享,可在线阅读,更多相关《TWI例程.docx(12页珍藏版)》请在冰豆网上搜索。

TWI例程.docx

TWI例程

文件用途    :

TWI/I2C驱动,查询方式,主机模式

原创者      :

SEE

修改者      :

林夕依然

最后修改时间  :

2009.03.15

使用说明    :

调用最后6个API应用程序接口函数进行I2C读写

调试说明    :

ATmega16L+ICC+AVRstudio4环境下调试通过。

注意事项    :

根据原创者意愿,如用于商业用途请注明文件来源。

--------------------------------------------------------------------*/

#ifndefI2C_H

#defineI2C_H

//主模式启动状态

#defineI2C_START                0x08  //启动总线

#defineI2C_RESTART      0x10  //重新启动总线

//主发送模式各种状态

#defineI2C_MT_SLA_ACK    0x18  //SLA_W写地址已发送,收到应答位

#defineI2C_MT_SLA_NACK    0x20  //SLA_W写地址已发送,收到非应答位

#defineI2C_MT_DATA_ACK    0x28  //写入数据已发送,收到应答位

#defineI2C_MT_DATA_NACK    0x30  //写入数据已发送,收到应答位

#defineI2C_MT_ARB_LOST    0x38  //SLA_W或数据仲裁失败

//主接收模式各种状态

#defineI2C_MR_ARB_LOST    0x38  //SLA_W或数据仲裁失败

#defineI2C_MR_SLA_ACK    0x40  //SLA_R已发送,收到应答位

#defineI2C_MR_SLA_NACK    0x48  //SLA_R已发送,收到非应答位

#defineI2C_MR_DATA_ACK    0x50  //接收到数据,应答位已返回

#defineI2C_MR_DATA_NACK    0x58  //接收到数据,非应答位已返回

//从接收模式各种状态

#defineI2C_SR_SLA_ACK      0x60

#defineI2C_SR_ARB_LOST_SLA_ACK  0x68

#defineI2C_SR_GCALL_ACK    0x70

#defineI2C_SR_ARB_LOST_GCALL_ACK  0x78

#defineI2C_SR_DATA_ACK      0x80

#defineI2C_SR_DATA_NACK    0x88

#defineI2C_SR_GCALL_DATA_ACK    0x90

#defineI2C_SR_GCALL_DATA_NACK  0x98

#defineI2C_SR_STOP      0xA0

//从发送模式各种状态

#defineI2C_ST_SLA_ACK    0xA8

#defineI2C_ST_ARB_LOST_SLA_ACK  0xB0

#defineI2C_ST_DATA_ACK    0xB8

#defineI2C_ST_DATA_NACK    0xC0

#defineI2C_ST_LAST_DATA    0xC8

//Misc

#defineI2C_NO_INFO      0xF8

#defineI2C_BUS_ERROR    0x00

//定义SLA中读写控制位极性

#defineI2C_READ  1

#defineI2C_WRITE  0

#defineI2CStart()    (TWCR=(1<

#defineI2CStop()    (TWCR=(1<

#defineI2C_STATUS    (TWSR&0xf8)

#defineI2CSenDACk()  (TWCR|=(1<

#defineI2CSendNoAck()  (TWCR&=~(1<

#defineI2CRcvNckByte()(TWCR=(1<

#defineI2CRcvAckByte()(TWCR=(1<

//定义运行状态返回值极性

#defineI2C_ERR  0    //错误

#defineI2C_CRR  1    //正确

//定义TWINT位置位查询等待时间

#defineWAITCOUNT  50

/*--------------------------------------------------------------------

函数名称:

I2C_Init

函数功能:

TWI初始化

注意事项:

(须根据具体情况设置)

提示说明:

输  入:

返  回:

--------------------------------------------------------------------*/

voidI2C_Init(void)

{

TWBR=0x0f;  //波特率设置,必须大于10

TWSR=0;    //状态寄存器初始化

//TWAR=    //从机地址和通用呼叫设置,多CPU时使用

}

/*--------------------------------------------------------------------

函数名称:

I2C_WaiTINT

函数功能:

等待TWINT位置位

注意事项:

需定义WAITCOUNT

提示说明:

输  入:

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_WaitINT(void)

{

unsignedinti="WAITCOUNT";

while(!

(TWCR&(1<

{if((--i)==0)returnI2C_ERR;}

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_SendByte

函数功能:

发送一字节数据

注意事项:

提示说明:

输  入:

待发送数据

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

voidI2C_SendByte(unsignedcharx)

{

  TWDR=(x);

  TWCR=(1<

}

/*--------------------------------------------------------------------

函数名称:

I2CStart

函数功能:

发出起始信号

注意事项:

提示说明:

输  入:

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_Start()    

{

I2CStart();                //发出起始信号

if(!

I2C_WaitINT())returnI2C_ERR;//等待启动完成

if(I2C_STATUS!

=I2C_START)      //检查是否启动成功

returnI2C_ERR;              //启动失败,返回0

returnI2C_CRR;              //启动成功,返回1

}

/*--------------------------------------------------------------------

函数名称:

I2CReStart

函数功能:

发出重复起始信号

注意事项:

提示说明:

输  入:

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_Restart()    

{

I2CStart();    

if(!

I2C_WaitINT())returnI2C_ERR;

if(I2C_STATUS!

=I2C_RESTART)    //检查是否重复启动成功

returnI2C_ERR;

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_SendWrDAdr

函数功能:

发送7位器件写地址:

XXXXXXX0

注意事项:

提示说明:

输  入:

写地址

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_SendWrDAdr(unsignedcharwrDAdr)

{

I2C_SendByte(wrDAdr);  //设置器件写地址

if(!

I2C_WaitINT())returnI2C_ERR;

if(I2C_STATUS!

=I2C_MT_SLA_ACK)  

  returnI2C_ERR;

returnI2C_CRR;  

}

/*--------------------------------------------------------------------

函数名称:

I2C_SendWrDAdr_

函数功能:

发送10位器件写地址:

11110XX0,XXXXXXXX

注意事项:

提示说明:

兼容发送7位器件写地址:

XXXXXXX0

输  入:

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_SendWrDAdr_(unsignedintwrDAdr)

{

if(wrDAdr&0xF000==0xF000)        //判断是否为10位器件地址

  if(I2C_SendWrDAdr((unsignedchar)wrDAdr>>8)==I2C_ERR)//设置(高位)器件写地址

  returnI2C_ERR;

if(I2C_SendWrDAdr((unsignedchar)wrDAdr)==I2C_ERR)//设置(低位)器件写地址

  returnI2C_ERR;

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_SendRdDAdr

函数功能:

发送7位器件读地址:

XXXXXXX1

注意事项:

提示说明:

输  入:

读地址

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_SendRdDAdr(unsignedcharrdDAdr)

{

I2C_SendByte(rdDAdr);  //设置器件读地址

if(!

I2C_WaitINT())returnI2C_ERR;

if(I2C_STATUS!

=I2C_MR_SLA_ACK)  

  returnI2C_ERR;

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_SendRdDAdr_

函数功能:

发送10位器件读地址:

11110XX0,XXXXXXXX

注意事项:

提示说明:

兼容发送7位器件读地址:

XXXXXXX1

输  入:

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_SendRdDAdr_(unsignedcharrdDAdr)

{

if(rdDAdr&0xF000==0xF000)      //判断是否为10位器件地址

if(I2C_SendWrDAdr((unsignedchar)rdDAdr>>8)==I2C_ERR)//设置(高位)器件读地址

  returnI2C_ERR;

if(I2C_SendWrDAdr((unsignedchar)rdDAdr)==I2C_ERR)//设置(低位)器件读地址

returnI2C_ERR;

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_SendDat

函数功能:

I2C发送数据

注意事项:

提示说明:

输  入:

待发送的字节数据

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_SendDat(unsignedchardata)

{

I2C_SendByte(data);  

if(!

I2C_WaitINT())returnI2C_ERR;

if(I2C_STATUS!

=I2C_MT_DATA_ACK)

returnI2C_ERR;

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_RcvNAckDat

函数功能:

I2C接收数据且不产生应答

注意事项:

提示说明:

输  入:

接收数据存储空间指针

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_RcvNAckDat(unsignedchar*pRdDat)

{

I2CRcvNckByte();

if(!

I2C_WaitINT())returnI2C_ERR;

if(I2C_STATUS!

=I2C_MR_DATA_NACK)

  returnI2C_ERR;

*pRdDat=TWDR;

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_RcvAckDat

函数功能:

I2C接收数据且产生应答

注意事项:

提示说明:

输  入:

接收数据存储空间指针

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_RcvAckDat(unsignedchar*pRdDat)

{

I2CRcvAckByte();    

if(!

I2C_WaitINT())returnI2C_ERR;

if(I2C_STATUS!

=I2C_MR_DATA_ACK)

  returnI2C_ERR;

*pRdDat=TWDR;

returnI2C_CRR;

}

/*以下是API函数*/

//(ApplicationProgramInteRFace应用程序接口)

/*--------------------------------------------------------------------

函数名称:

I2C_Write(unsignedintwrDAdr,unsignedcharwordAdr,unsignedchardat)

函数功能:

I2C写器件,写一个字节

注意事项:

提示说明:

输  入:

wrDAdr:

writedevice-address写器件地址

      wordAdr:

wordaddress从地址

      dat:

data数据

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_Write(unsignedintwrDAdr,unsignedcharwordAdr,unsignedchardat)

{

if(I2C_Start()==I2C_ERR)

  returnI2C_ERR;

//wrDAdr&=0xfffe;

if(I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR)//保证写控制位正确

  returnI2C_ERR;

if(I2C_SendDat(wordAdr)==I2C_ERR)//从地址当作一般数据发送

  returnI2C_ERR;

if(I2C_SendDat(dat)==I2C_ERR)

  returnI2C_ERR;

I2CStop();

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_Write_

函数功能:

I2C写器件,写N个数据

注意事项:

提示说明:

输  入:

wrDAdr:

writedevice-address写器件地址

      wordAdr:

wordaddress从地址

      *pWrDat:

p->writedata写入数据的指针

      num  :

number写入数据个数

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_Write_(unsignedintwrDAdr,unsignedcharwordAdr,

    unsignedchar*pWrDat,unsignedcharnum)

{

  unsignedchari;

if(I2C_Start()==I2C_ERR)

  returnI2C_ERR;

  //wrDAdr&=0xfffe;

if(I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR)//保证写控制位正确

  returnI2C_ERR;

if(I2C_SendDat(wordAdr)==I2C_ERR)//从地址当作一般数据发送

  returnI2C_ERR;

for(i=0;i

  if(I2C_SendDat(*(pWrDat++))==I2C_ERR)

  returnI2C_ERR;

I2CStop();

returnI2C_CRR;

}

/*--------------------------------------------------------------------

函数名称:

I2C_Read

函数功能:

I2C读器件,读一个数据

注意事项:

提示说明:

输  入:

rdDAdr:

readdevice-address读器件地址

      wordAdr:

wordaddress从地址

    *pRdDat:

p->readdata读取数据指针

返  回:

运行状况  I2C_ERR:

错误  I2C_CRR:

正确

--------------------------------------------------------------------*/

unsignedcharI2C_Read(unsignedintrdDAdr,unsignedcharwordAdr,unsignedchar*pRdDat)

{

if(I2C_Start()==I2C_ERR)

  returnI2C_ERR;

  //rdDAdr&=0xfffe;

if(I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR)//保证写控制位正确

  returnI2C_E

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1