📄 i2cfeep.h
字号:
#ifndef _I2CFEEP_H
#define _I2CFEEP_H
#define I2CADD 0xd0
#define I2CINIT(ParaName) (ParaName=BeEEPROM)
unsigned char BeEEPROM[10];
//int slarv =0;
unsigned char slarv=0;
//int adrpoint=33;
unsigned char adrpoint=33;
//unsigned char judge=0x7e;
unsigned char state=0;
/*--------------------------------------------------*/
interrupt [18] void twi_isr(void)
{
//twi event
TWCR&=0X7F;
//TWCR|=0X80;
//COM_LED=1-COM_LED;
// if(LEDCOM == 0)
// {
// COM_LED=0;
// LEDCOM=1;
// }
// else
// {
// COM_LED=1;
// LEDCOM=0;
// }
//delay_ms(1);
state=TWSR&0xF8;
//USART_Transmit_Unwait(state);
switch (state)
{
//从接收
case TW_SR_SLA_ACK:
case TW_SR_ARB_LOST_SLA_ACK:
case TW_SR_GCALL_ACK:
case TW_SR_ARB_LOST_GCALL_ACK:
slarv=0;
Twi_Ack(); //返回ACK
break;
case TW_SR_DATA_ACK:
case TW_SR_DATA_NACK:
if(slarv==0)
{
adrpoint = TWDR;
slarv = 1;
}
else
{ BeEEPROM[adrpoint]=TWDR;
//datais[adrpoint] = TWDR;
slarv=0;
adrpoint++;
}
Twi_Ack(); //返回ACK
break;
case TW_SR_GCALL_DATA_ACK:
case TW_SR_GCALL_DATA_NACK:
Twi_Ack(); //返回ACK
break;
case TW_SR_STOP:
Twi_Ack();
break;
//从发送*****************************
case TW_ST_SLA_ACK: // 0xA8: 自己的SLA+R 已经被接收,ACK 已返回
case TW_ST_ARB_LOST_SLA_ACK:// 0xB0: SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回
// 被选中为从读出 (数据将从传回主机)
//TWDR=main_tmp; //发送全局变量中值
case TW_ST_DATA_ACK: // 0xB8: TWDR 里数据已经发送,接收到ACK
//发送数据位
// TWDR=main_tmp;
//TWDR=0xaa;
if(adrpoint!=33)
TWDR=BeEEPROM[adrpoint];
Twi_Ack();
break;
case TW_ST_DATA_NACK: // 0xC0: TWDR 里数据已经发送接收到NOT ACK
case TW_ST_LAST_DATA: // 0xC8: TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK
// 全部完成
// 从方式开放
Twi_NoAcK();
twi_slave_init(I2CADD); //重新回到初始化状态,等待接收模式的到来
break;
case TW_NO_INFO: // 0xF8: 没有相关的状态信息;TWINT = “0”
// 无操作
break;
case TW_BUS_ERROR: // 0x00: 由于非法的START 或STOP 引起的总线错误
// 内部硬件复位,释放总线
TWCR=TWCR&TWCR_CMD_MASK|(1<<7)|(1<<4)|(1<<6);
break;
default:
//PORTD=0XFF;
break;
}
}
/*--------------------------------------------------*/
/*--------------------------------------------------*/
void twi_slave_init(uint8 add)
{
TWCR= 0x00; //disable twi
TWBR= 0x00; //set bit rate
TWSR= 0x00; //set prescale
TWAR= add; //set slave address 从机地址为 0x01
TWCR= 0x45; //enable twi
//TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播) 时返回确认信息ACK
}
/*--------------------------------------------------*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -