📄 twi_slave.c
字号:
/*********************************************************************************
cpu:atmega8
TWI初始化程序---------作为从机 2005.8.23
**********************************************************************************/
#include <iom8v.h>
#include "twi.h"
unsigned char Ram_Buf[32];
unsigned char Twi_State;
unsigned char Mem_Data, Mem_Adr, Mem_Write_Flag;
void twi_init(void)
{
Mem_Write_Flag = false;
Twi_State = TWI_NONE;
TWCR= 0X00; //disable twi
TWBR= 0x00; //set bit rate
TWSR= 0x00; //set prescale
TWAR= DEVICE_ADR; //set slave address
TWCR= 0x45; //enable twi 置位TWEA,TWEN TWIE
}
#pragma interrupt_handler twi_isr:iv_TWI
void twi_isr(void)
{ unsigned char status;
status = TWSR & 0xF8;
switch(status)
{
//------ I2C 读(对于从机来说)相关:0x60, 0x80, 0xA0 -------------------
case 0x60: Twi_State = TWI_MEM_ADR;
Twi_ACK();
break;
//这里用TWI_MEM_ADR,WI_MEM_DATA,来分别送来的是地址,还是数据
//对I2C来说,两都是数据,而在这边是根据用户自己定的协议来完成的
case 0x80: if(Twi_State == TWI_MEM_ADR)
{ Mem_Adr = TWDR;
Twi_State = TWI_MEM_DATA;
}
else if(Twi_State == TWI_MEM_DATA)
{ Mem_Data = TWDR;
Mem_Write_Flag = true;
Twi_State = TWI_NONE;
}
Twi_ACK();
break;
case 0xA0: Twi_State = TWI_NONE;
Twi_ACK();
break;
// ------ I2C 写(对于从机来说)相关 0xA8, 0xC0 ---------------
//主机要读数据,那它要先送一个地址过来,才知道它想要读什么
case 0xA8: Twi_Write_Byte( Ram_Buf[Mem_Adr] );
/**写标志位如果有被查询时,则清零*/
if(Mem_Adr == ADR_CONTROL)
Ram_Buf[ADR_CONTROL] = 0x00;
/*******************************/
break;
case 0xC0: Twi_ACK();
break;
default: Twi_State = TWI_NONE;
Twi_Stop();
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -