AVR与AT24C256I2C程序TWI.docx

上传人:b****2 文档编号:17186813 上传时间:2023-04-24 格式:DOCX 页数:20 大小:18KB
下载 相关 举报
AVR与AT24C256I2C程序TWI.docx_第1页
第1页 / 共20页
AVR与AT24C256I2C程序TWI.docx_第2页
第2页 / 共20页
AVR与AT24C256I2C程序TWI.docx_第3页
第3页 / 共20页
AVR与AT24C256I2C程序TWI.docx_第4页
第4页 / 共20页
AVR与AT24C256I2C程序TWI.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

AVR与AT24C256I2C程序TWI.docx

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

AVR与AT24C256I2C程序TWI.docx

AVR与AT24C256I2C程序TWI

/*调试通过20130202

24c256连续读取多个数据.多写,可单读单写

*/

#include

#include

//数据类型预定义8位,16位整数

#defineINT8Uunsignedchar

#defineINT16Uunsignedint

#defineF_CPU7372800UL

/*TWSRvalues(notbits)*/

/*Master*/

#defineI2C_START0x08

#defineI2C_RESTART0x10

/*MasterTransmitter*/

#defineI2C_MT_SLA_ACK0x18//?

#defineI2C_MT_SLA_NACK0x20//?

#defineI2C_MT_DATA_ACK0x28

#defineI2C_MT_DATA_NACK0x30//?

#defineI2C_MT_ARB_LOST0x38//?

/*MasterReceiver*/

#defineI2C_MR_ARB_LOST0x38//?

#defineI2C_MR_SLA_ACK0x40

#defineI2C_MR_SLA_NACK0x48//?

#defineI2C_MR_DATA_ACK0x50//?

#defineI2C_MR_DATA_NACK0x58//?

/*SlaveTransmitter*/

#defineI2C_ST_SLA_ACK0xA8//?

#defineI2C_ST_ARB_LOST_SLA_ACK0xB0//?

#defineI2C_ST_DATA_ACK0xB8//?

#defineI2C_ST_DATA_NACK0xC0//?

#defineI2C_ST_LAST_DATA0xC8//?

/*SlaveReceiver*/

#defineI2C_SR_SLA_ACK0x60//?

#defineI2C_SR_ARB_LOST_SLA_ACK0x68//?

#defineI2C_SR_GCALL_ACK0x70//?

#defineI2C_SR_ARB_LOST_GCALL_ACK0x78//?

#defineI2C_SR_DATA_ACK0x80//?

#defineI2C_SR_DATA_NACK0x88//?

#defineI2C_SR_GCALL_DATA_ACK0x90//?

#defineI2C_SR_GCALL_DATA_NACK0x98//?

#defineI2C_SR_STOP0xA0//?

/*Misc*/

#defineI2C_NO_INFO0xF8//?

#defineI2C_BUS_ERROR0x00//?

/*

*Thelower3bitsofTWSRarereservedontheATmega163.

*The2LSBcarrytheprescalerbitsonthenewerATmegas.

*/

#defineI2C_STATUS_MASK(_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3))

#defineI2C_STATUS(TWSR&I2C_STATUS_MASK)

/*

*R/~WbitinSLA+R/Waddressfield.

*/

#defineI2C_READ1

#defineI2C_WRITE0

#defineI2CStart()(TWCR=(1<

#defineI2CStop()(TWCR=(1<

#defineI2CWaitAck(){while(!

(TWCR&(1<

#defineI2CChkAck()(TWSR&0xf8)//checkack

#defineI2CSendAck()(TWCR|=(1<

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

#defineI2CSendByte(x){TWDR=(x);TWCR=(1<

#defineI2CRcvNckByte()(TWCR=(1<

#defineI2CRcvAckByte()(TWCR=(1<

/*ForProgram*/

#defineI2C_Stop()I2CStop()

#defineI2C_SendAck()I2CSendAck()

#defineI2C_SendNoAck()I2CSendNoAck()

#defineI2C_WaitAck()I2CWaitAck()

/*I2CConfig*/

#defineI2C_ERR0

#defineI2C_CRR1

//chardata1;//为观察读取的数据的临时观察变量

#ifndefWR_DADR

#defineWR_DADR0xa0//writedevice-address

#endif

#ifndefRD_DADR

#defineRD_DADR0xa1//readdevice-address

#endif

//#defineAT24CXX_ERR0

//#defineAT24CXX_CRR1

//******************************twi初始化*************************************

//TWCR:

控制寄存器,用来控制TWI操作,说明如下:

//Bit7-TWINT:

中断标志位,Bit6-TWEA:

使能应答位,Bit5-TWSTA:

START状态位

//Bit4-TWSTO:

STOP状态位,Bit3-TWWC:

写冲突标志,Bit2-TWEN:

TWI使能位

//Bit1-RES:

保留,Bit0-TWIE:

中断使能

//TWSR:

状态寄存器,Bits7..3:

表示了TWI总线的当前状态,读取时需屏蔽低三位的值,Bits1..0-TWPS:

TWI预分频位

//TWBR:

比特率寄存器,用来设置TWI的工作频率,计算公式为:

SCL=CPU频率/(16+2*(TWBR)*4TWPS),TWPS在4的指数位置

//TWAR:

从机地址寄存器,Bits7..1:

存放从机地址,Bit0:

最低位为广播识别使能位

//TWDR:

数据寄存器,用来存放接收或要发送的地址和数据

//******************************************************************************

voidtwi_init(void)

{

TWBR=1;

TWSR=0;

TWCR=0x44;

}

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

程序名称:

I2CStart

程序功能:

注意事项:

提示说明:

输入:

返回:

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

INT8UI2C_Start()

{

I2CStart();

I2CWaitAck();//202页第二步等待

if(I2CChkAck()!

=I2C_START)//202页第三步开始启动传输

returnI2C_ERR;

returnI2C_CRR;

}

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

程序名称:

I2CReStart

程序功能:

注意事项:

提示说明:

输入:

返回:

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

INT8UI2C_Restart()

{

I2CStart();

I2CWaitAck();

if(I2CChkAck()!

=0x10)

returnI2C_ERR;

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)发送7位器件写地址:

XXXXXXX0

程序功能:

注意事项:

提示说明:

输入:

返回:

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

INT8UI2C_SendWrDAdr(INT8UwrDAdr)//wrDAdr相当于202页表中提到的sla_w

{

I2CSendByte(wrDAdr);//202页第四步1.将SLA_W载入到TWDR寄存器,TWINT位清零,启动发送地址设置器件写地址

I2CWaitAck();//202页第四步2等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACK

if((TWSR&0xf8)!

=0x18)//202页表中第5步检验TWI状态寄存器,屏蔽预分频位,如果状态字不是MT_SLA_ACK转出错处理

returnI2C_ERR;

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)发送10位器件写地址:

11110XX0,XXXXXXXX

程序功能:

注意事项:

提示说明:

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

XXXXXXX0

输入:

返回:

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

INT8UI2C_SendWrDAdr_(INT16UwrDAdr)

{

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

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

returnI2C_ERR;

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

returnI2C_ERR;

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)发送7位器件读地址:

XXXXXXX1

程序功能:

注意事项:

提示说明:

输入:

返回:

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

INT8UI2C_SendRdDAdr(INT8UrdDAdr)

{

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

I2CWaitAck();

if(I2CChkAck()!

=I2C_MR_SLA_ACK)//I2C_MR_SLA_ACK=0x40

returnI2C_ERR;

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)发送10位器件读地址:

11110XX0,XXXXXXXX

程序功能:

注意事项:

提示说明:

输入:

返回:

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

INT8UI2C_SendRdDAdr_(INT8UrdDAdr)

{

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

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

returnI2C_ERR;

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

returnI2C_ERR;

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)发送数据

程序功能:

注意事项:

提示说明:

输入:

返回:

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

INT8UI2C_SendDat(INT8UconfigDat)//原先位16位

{

I2CSendByte(configDat);

I2CWaitAck();

if(I2CChkAck()!

=I2C_MT_DATA_ACK)

returnI2C_ERR;

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)接收数据且不产生应答

程序功能:

只读一个字节,然后停止读取

注意事项:

提示说明:

读取一个字节后,发送不响应,用于读取1个字节

输入:

返回:

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

INT8UI2C_RcvNAckDat(INT8U*pRdDat)

{

I2CRcvNckByte();

I2CWaitAck();

if(I2CChkAck()!

=I2C_MR_DATA_NACK)//接收到数据0x58

returnI2C_ERR;

*pRdDat=TWDR;

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)接收数据且产生应答

程序功能:

用于连续读取,读取单个字节后,在读下一个字节.最后读取n个字节后,再停止.

注意事项:

提示说明:

读取一个字节后,发送响应,用于读取多个字节

输入:

返回:

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

INT8UI2C_RcvAckDat(INT8U*pRdDat)

{

I2CRcvAckByte();

I2CWaitAck();

if(I2CChkAck()!

=0x50)

returnI2C_ERR;

*pRdDat=TWDR;

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)写器件,写一个数据

程序功能:

注意事项:

提示说明:

输入:

wrDAdr:

writedevice-address写器件地址

wordAdr:

wordaddress字地址

dat:

data数据

返回:

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

INT8UI2CWriteByte(INT8UwrDAdr,INT16UwordAdr,INT8Udat)

{

if(I2C_Start()==I2C_ERR)

returnI2C_ERR;

if(I2C_SendWrDAdr_(wrDAdr)==0)

returnI2C_ERR;

if(I2C_SendDat((wordAdr&0xff00)>>8)==I2C_ERR)

returnI2C_ERR;

if(I2C_SendDat(wordAdr&0x00ff)==I2C_ERR)

returnI2C_ERR;

if(I2C_SendDat(dat)==0)

returnI2C_ERR;

I2C_Stop();

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)写器件,写N个数据

程序功能:

注意事项:

提示说明:

输入:

wrDAdr:

writedevice-address写器件地址

wordAdr:

wordaddress存储数据的起始地址

*pWrDat:

p->writedata写入数据指针

num:

number写入数据个数

返回:

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

INT8UI2CWriteStr(INT8UwrDAdr,INT16UwordAdr,INT8U*pWrDat,INT8Unum)

{

INT16Ui;

if(I2C_Start()==I2C_ERR)

returnI2C_ERR;

if(I2C_SendWrDAdr_(wrDAdr)==0)

returnI2C_ERR;

if(I2C_SendDat((wordAdr&0xff00)>>8)==I2C_ERR)

returnI2C_ERR;

if(I2C_SendDat(wordAdr&0x00ff)==I2C_ERR)

returnI2C_ERR;

for(i=0;i

if(I2C_SendDat(*(pWrDat+i))==0)

returnI2C_ERR;

I2C_Stop();

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)读器件,读一个数据

程序功能:

注意事项:

提示说明:

输入:

wrDAdr:

writedevice-address写器件地址

wordAdr:

wordaddress字地址

rdDAdr:

readdevice-address读器件地址

*pRdDat:

p->readdata读取数据指针

返回:

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

INT8UI2CReadByte(INT8UwrDAdr,INT16UwordAdr,INT8UrdDAdr,INT8U*pRdDat)

{

if(I2C_Start()==I2C_ERR)

returnI2C_ERR;

if(I2C_SendWrDAdr_(wrDAdr)==I2C_ERR)

returnI2C_ERR;

////16位地址拆分

if(I2C_SendDat((wordAdr&0xff00)>>8)==I2C_ERR)

returnI2C_ERR;

if(I2C_SendDat(wordAdr&0x00ff)==I2C_ERR)

returnI2C_ERR;

if(I2C_Restart()==I2C_ERR)

returnI2C_ERR;

if(I2C_SendRdDAdr(rdDAdr)==I2C_ERR)

returnI2C_ERR;

if(I2C_RcvNAckDat(pRdDat)==I2C_ERR)

returnI2C_ERR;

I2C_Stop();

returnI2C_CRR;

}

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

程序名称:

I2C(TWI)读器件,读N个数据

程序功能:

注意事项:

提示说明:

输入:

wrDAdr:

writedevice-address写器件地址

wordAdr:

wordaddress存储数据的起始地址

rdDAdr:

readdevice-address读器件地址

*pRdDat:

p->readdata读取数据指针

num:

number读取数据个数

返回:

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

INT8UI2CReadStr(INT8UwrDAdr,INT16UwordAdr,INT8UrdDAdr,INT8U*pRdDat,INT8Unum)

{

INT8Ui;

if(I2C_Start()==I2C_ERR)

returnI2C_ERR;

if(I2C_SendWrDAdr_(wrDAdr)==I2C_ERR)

returnI2C_ERR;

//16位24c256存储空间地址拆分

if(I2C_Se

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

当前位置:首页 > 工程科技 > 交通运输

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

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