?? twi_slave.c
字號(hào):
/*********************************************************************************
cpu:atmega8
TWI初始化程序---------作為從機(jī) 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 讀(對于從機(jī)來說)相關(guān):0x60, 0x80, 0xA0 -------------------
case 0x60: Twi_State = TWI_MEM_ADR;
Twi_ACK();
break;
//這里用TWI_MEM_ADR,WI_MEM_DATA,來分別送來的是地址,還是數(shù)據(jù)
//對I2C來說,兩都是數(shù)據(jù),而在這邊是根據(jù)用戶自己定的協(xié)議來完成的
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 寫(對于從機(jī)來說)相關(guān) 0xA8, 0xC0 ---------------
//主機(jī)要讀數(shù)據(jù),那它要先送一個(gè)地址過來,才知道它想要讀什么
case 0xA8: Twi_Write_Byte( Ram_Buf[Mem_Adr] );
/**寫標(biāo)志位如果有被查詢時(shí),則清零*/
if(Mem_Adr == ADR_CONTROL)
Ram_Buf[ADR_CONTROL] = 0x00;
/*******************************/
break;
case 0xC0: Twi_ACK();
break;
default: Twi_State = TWI_NONE;
Twi_Stop();
break;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -