微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ATMEGA16通过TWI对24C02进行读写

ATMEGA16通过TWI对24C02进行读写

时间:11-23 来源:互联网 点击:

#ifndef TWI_H
#define TWI_H

//主机模式启动状态码
#define TWI_START 0X08
#define TWI_RESTART 0X10
//主机发送模式状态码
#define TWI_MT_SLA_ACK 0X18 //SLA+W 已发送,接收到ACK
#define TWI_MT_SLA_NACK 0X20 //SLA+W 已发送,接收到NOT ACK
#define TWI_MT_DATA_ACK 0X28 //数据已发送,接收到ACK
#define TWI_MT_DATA_NACK 0X30 //数据已发送,接收到NOT ACK
#define TWI_MT_ARB_LOST 0X38 //SLA+W 或数据的仲裁失败
//主机接收模式状态码
#define TWI_MR_ARB_LOST 0X38 //SLA+R 或数据的仲裁失败
#define TWI_MR_SLA_ACK 0X40 //SLA+R 已发送,接收到ACK
#define TWI_MR_SLA_NACK 0X48 //SLA+R 已发送,接收到NOT ACK
#define TWI_MR_DATA_ACK 0X50 //数据已接收,接收到ACK
#define TWI_MR_DATA_NACK 0X58 //数据已接收,接收到NOT ACK
//从机接收模式状态码
#define TWI_SR_SLA_ACK 0X60 //自己的SLA+W 已经被接收,ACK 已返回
#define TWI_SR_ARB_LOST_SLA_ACK 0X68 //SLA+R/W 作为主机的仲裁失败;自己的SLA+W 已经被接收,ACK 已返回
#define TWI_SR_GCALL_ACK 0X70 //接收到广播地址,ACK 已返回
#define TWI_SR_ARB_LOST_GCALL_ACK 0X78 //SLA+R/W 作为主机的仲裁失败;接收到广播地址ACK 已返回
#define TWI_SR_DATA_ACK 0X80 //以前以自己的 SLA+W 被寻址;数据已经被接收ACK 已返回
#define TWI_SR_DATA_NACK 0X88 //以前以自己的 SLA+W 被寻址;数据已经被接收NOT ACK 已返回
#define TWI_SR_GCALL_DATA_ACK 0X90 //以前以广播方式被寻址;数据已经被接收ACK 已返回
#define TWI_SR_GCALL_DATA_NACK 0X98 //以前以广播方式被寻址;数据已经被接收NOT ACK 已返回
#define TWI_SR_STOP 0XA0 //在以从机工作时接收到STOP或重复START
//从机发送模式状态码
#define TWI_ST_SLA_ACK 0XA8 //自己的SLA+R 已经被接收ACK 已返回
#define TWI_ST_ARB_LOST_SLA_ACK 0XB0 //SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收ACK 已返回
#define TWI_ST_DATA_ACK 0XB8 //TWDR 里数据已经发送,接收到ACK
#define TWI_ST_DATA_NACK 0XC0 //TWDR 里数据已经发送,接收到NOT ACK
#define TWI_ST_LAST_DATA 0XC8 //TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK
//其他状态
#define TWI_NO_INFO 0xF8 //没有相关的状态信息,TWINT=0
#define TWI_BUS_ERROR 0x00 //由于非法的START或STOP引起的总线错误
//TWI使用时的控制位
#define TWI_Start() TWCR = (1 //清零TWINT、清零start状态、使能TWI.发出START 信号
#define TWI_Wait() while (!(TWCR & (1 //等待TWINT 置位, TWINT 置位表示START 信号已发出
#define TWI_Status (TWSR & 0xF8) //检验TWI 状态寄存器,屏蔽预分频位
#define TWI_Stop() TWCR=(1 //发送STOP 信号
#define TWI_SendAck() (TWCR|=(1 //使能TWI应答
#define TWI_SendNoAck() (TWCR&=~(1 //不使能TWI应答
#define TWI_RcvNckByte() (TWCR=(1 //使能TWI不产生应答
#define TWI_RcvAckByte() (TWCR=(1 //使能TWI、产生应答
#define TWI_Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1// 定义TWI运行状态的极性
#define TWI_ERR 0
#define TWI_CRR 1

#define TWI_WRITE 0
#define TWI_READ 1
void delay(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=1141;j>0;j--);
}

void TWI_Init(void)
{
TWBR=0X0F;
TWSR=0;
}

uchar TWIWait(void)
{
uchar i=100;
while(!(TWCR&(1 //等待TWINT置1
{
if((--i)==0)
return TWI_ERR;
}
return TWI_CRR;
}

uchar TWIStart(void)
{
TWI_Start();
if(TWIWait()==TWI_ERR)
return TWI_ERR;
if(TWI_Status!=TWI_START)
return TWI_ERR;
return TWI_CRR;
}

uchar TWIREStart(void)
{
TWI_Start();
if(TWIWait()==TWI_ERR)
return TWI_ERR;
if(TWI_Status!=TWI_RESTART)
return TWI_ERR;
return TWI_CRR;
}

uchar TWI_Write_WADDR(uchar addr)
{
TWI_Writebyte(addr);
if(TWIWait()==TWI_ERR)
return TWI_ERR;
if(TWI_Status!=TWI_MT_SLA_ACK)
return TWI_ERR;
return TWI_CRR;
}

uchar TWI_Write_RADDR(uchar addr)
{
TWI_Writebyte(addr);
if(TWIWait()==TWI_ERR)
return TWI_ERR;
if(TWI_Status!=TWI_MR_SLA_ACK)
return TWI_ERR;
return TWI_CRR;
}

uchar TWI_SendData(uchar data)
{
TWI_Writebyte(data);
if(TWIWait()==TWI_ERR)
return TWI_ERR;
if(TWI_Status!=TWI_MT_DATA_ACK)
return TWI_ERR;
return TWI_CRR;
}

uchar TWI_ReciveDATA_ACK(uchar *pdata)
{
TWI_RcvAckByte();
if(TWIWait()==TWI_ERR)
return TWI_ERR;
if(TWI_Status!=TWI_MR_DATA_ACK)
return TWI_ERR;
*pdata=TWDR;
return TWI_CRR;
}

uchar TWI_ReciveDATA_NACK(uchar *pdata)
{
TWI_RcvNckByte();
if(TWIWait()==TWI_ERR)
return TWI_ERR;
if(TWI_Status!=TWI_MR_DATA_NACK)
return TWI_ERR;
*pdata=TWDR;
return TWI_CRR;
}

uchar TWI_W_Byte(uchar Maddr,uchar Saddr,uchar data)
{
if(TWIStart()==TWI_ERR)
return TWI_ERR;
if(TWI_Write_WADDR((Maddr&0xfe)|TWI_WRITE)==TWI_ERR) //保证写入的SLA+W正确
return TWI_ERR;
if(TWI_SendData(Saddr)==TWI_ERR) //器件内寄存器的地址作为一般数据发送
return TWI_ERR;
if(TWI_SendData(data)==TWI_ERR) //发送要写入的数据
return TWI_ERR;
TWI_Stop();
return TWI_CRR;
}

uchar TWI_W_Data(uchar Maddr,uchar Saddr,uchar *pdata,uchar num)
{
uchar i;
if(TWIStart()==TWI_ERR)
return TWI_ERR;
if(TWI_Write_WADDR((Maddr&0xfe)|TWI_WRITE)==TWI_ERR) //保证写入的SLA+W正确
return TWI_ERR;
if(TWI_SendData(Saddr)==TWI_ERR) //器件内寄存器的地址作为一般数据发送
return TWI_ERR;
for(i=0;i {
if(TWI_SendData(*(pdata++))==TWI_ERR)
return TWI_ERR;
}
TWI_Stop();
return TWI_CRR;
}

uchar TWI_R_Byte(uchar Maddr,uchar Saddr,uchar *pdata)
{
if(TWIStart()==TWI_ERR)
return TWI_ERR;
if(TWI_Write_WADDR((Maddr&0xfe)|TWI_WRITE)==TWI_ERR) //保证写入的SLA+W正确
return TWI_ERR;
if(TWI_SendData(Saddr)==TWI_ERR) ////器件内寄存器的地址作为一般数据发送
return TWI_ERR;
if(TWIREStart()==TWI_ERR) //这里的重新发送start很重要,这里我们的主机不想放弃TWI的使用权 参看《深入浅出AVR

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top