📄 twi._c
字号:
#include "config.h"
//TWI master initialize
// bit rate:100
void twi_master_init(void)
{
TWCR= 0x00; //disable twi
TWBR= 0x64; //set bit rate
TWSR= 0x00; //set prescale
TWAR= 0x00; //set slave address
TWCR= 0x04; //enable twi
}
//TWI slave initialize
// bit rate:100
void twi_slave_init(uint8 add)
{
TWCR= 0x00; //disable twi
TWBR= 0x64; //set bit rate
TWSR= 0x00; //set prescale
TWAR= (add<<1); //set slave address 从机地址为 0x01
TWCR= (1<<TWEN)|(1<<TWEA)|(1<<TWIE); //enable twi
//TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播) 时返回确认信息ACK
}
//总线上起动开始条件
void i2c_start(void)
{
TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))); //等待START 信号成功发送
}
//把一个字节数据输入器件, 返回TWI状态
//发送地址,r_w:1为读,0为写
uint8 i2c_write_addr(uint8 addr,uint8 r_w)
{
if(r_w)
{
TWDR = addr|r_w; //RW 为1:读操作
}
else
{
TWDR = addr & 0xFE; // RW 为0: 写操作
}
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
_NOP();
return(TWSR&0b11111000); //TWSR高五位为I2C工作状态。
}
//把一个字节数据输入器件, 返回TWI状态
//发送数据
uint8 i2c_write_data(uint8 data)
{
TWDR = data;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
_NOP();
return(TWSR&0b11111000); //TWSR高五位为I2C工作状态。
}
//从器件读出一个字节
uint8 i2c_read(void)
{
TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);
Twi_NoAcK();
while (!(TWCR & (1<<TWINT)));
return(TWDR);
}
//总线上起动停止条件
void i2c_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
//操作步骤: 启动,发送地址,发送数据,关闭总线
void i2c_maste_transt(uint8 addr, uint8 data)
{
i2c_start();
if(i2c_write_addr(addr, 0)==TW_MT_SLA_ACK) //发送地址成功并收到ACK
{
i2c_write_data(data);
}
i2c_stop();
}
//操作步骤,启动,发送地址,读数据,关闭总线
uint8 i2c_maste_read(uint8 addr)
{
uint8 tmp=0;
i2c_start();
if(i2c_write_addr(addr, 1)==TW_MR_SLA_ACK) //发送地址成功并收到ACK
{
tmp=i2c_read();
}
i2c_stop();
return tmp;
}
#if TWI_MOD==0 //从机模式
#pragma interrupt_handler twi_isr:18
void twi_isr(void)
{
//twi event
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -