📄 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 + -