?? twi_master.c
字號:
/*****************************************************************
一包數據得發送三個字節:從機地址,RAM地址,和數據
采用中斷方式發送出去
******************************************************************/
#include <iom8v.h>
#include <macros.h>
#include "master.h"
unsigned char Twi_Data[3];
unsigned char Twi_State;
unsigned char Mem_Data, Mem_Adr, Mem_Write_Flag;
void twi_init(void)
{
Twi_State = TWI_NONE;
TWCR= 0X00; //disable twi
TWBR= 0x20; //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)
{
switch (TestAck())
{
//主控發送
case START: //0x08
{
Write8Bit(TWi_Data[0]|0x00); //發送從機地址且設為寫
Twi_State = TWI_MEM_ADR;
break;
}
case MT_SLA_ACK: //0x18
{
if(Twi_State == TWI_MEM_ADR)
{
Write8Bit(TWi_Data[1]);//發送RAM地址
Twi_State = TWI_MEM_DATA;
}
break;
}
case MT_SLA_NOACK: //0x20
{
Stop();
Twi_State = TWI_NONE;
break;
}
case MT_DATA_ACK: //0x28
{
if(Twi_State == TWI_MEM_DATA)
{
Write8Bit(TWi_Data[2]); //發送數據
Twi_State = TWI_NONE;
}
break;
}
case MT_DATA_NOACK: //0x30
{
Stop();
Twi_State = TWI_NONE;
break;
}
case SR_STOP_RESTART : //0x10
{
Write8Bit(TWi_Data[0]|0x01); //發送從機地址且設為讀
TWI_STATE=TWI_STOP;
break;
}
//主控接收
case MR_SLA_ACK: //0x40
{
break;
}
case MR_SLA_NOACK: //0x48
{
break;
}
case MR_DATA_ACK: //0x50
{
break;
}
case MR_DATA_NOACK: //0x58
{
TWI_STATE=TWI_STOP;
Stop();
break;
}
default:
{
TWI_STATE=TWI_STOP;
Stop();//從機模式恢復TWI響應能力
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -