TWI例程.docx
- 文档编号:23867534
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:12
- 大小:16.93KB
TWI例程.docx
《TWI例程.docx》由会员分享,可在线阅读,更多相关《TWI例程.docx(12页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TWI 例程