📄 m8-iic读写.c
字号:
/************24c02读写******************************/
#include <avr/io.h>
#include "M8-IIC.h"
#define w24c02_address 0xa0
#define r24c02_address 0xa1
/*****************************************************/
void IIC_init() //主机模式,高位先传输
{
DDRC=0x00; //PC4 PC5输入,使能上拉电阻
PORTC=0xff;
}
/**********************************************************/
void IIC_START()
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //TWINT中断标志位 置位时SCL低电平延长,TWSTA:START状态标志,发送START信号申请成为主机 TWEN TW使能位
}
/**************************************************/
void IIC_STOP()
{
TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); //发送停止信号
}
/**************************************************/
void IIC_WT_BYTE(unsigned char BYTE)
{
TWDR=BYTE;
TWCR=(1<<TWINT)|(1<<TWEN);
}
/**************************************************/
void AT24C_WRITE(unsigned char reg_addr,unsigned char BYTE)
{
IIC_START(); //发送起始信号并读取发送状态
wait();
if((TWSR&0xf8)!=START_OK) //检测状态与成功标志不符
goto last ; //出错处理
else
IIC_WT_BYTE(w24c02_address);
wait();
if((TWSR&0xf8)!=W_ADDR_ACK) //检测状态与成功标志不符
goto last ; //出错处理
else
IIC_WT_BYTE(reg_addr);
wait();
if((TWSR&0xf8)!=W_DATA_ACK) //检测状态与成功标志不符
goto last ; //出错处理
else
IIC_WT_BYTE(BYTE);
wait();
if((TWSR&0xf8)!=W_DATA_ACK) //检测状态与成功标志不符
goto last ; //出错处理
else
IIC_STOP();
last:
error();
}
/**************************************************/
unsigned char AT24C_READ(unsigned char reg_addr)
{
unsigned char data;
IIC_START(); //发送起始信号并读取发送状态
wait();
if((TWSR&0xf8)!=START_OK) //检测状态与成功标志不符
goto last ; //出错处理
else
IIC_WT_BYTE(w24c02_address);
wait();
if((TWSR&0xf8)!=W_ADDR_ACK) //检测状态与成功标志不符
goto last ; //出错处理
else
IIC_WT_BYTE(reg_addr);
wait();
if((TWSR&0xf8)!=W_DATA_ACK) //检测状态与成功标志不符
goto last ; //出错处理
else
IIC_START(); //发送起始信号并读取发送状态
wait();
if((TWSR&0xf8)!=START_REPEAT) //检测状态与成功标志不符
goto last ; //出错处理
else
IIC_WT_BYTE(r24c02_address);
wait();
if((TWSR&0xf8)!=R_ADDR_ACK) //检测状态与成功标志不符
goto last ; //出错处理
else
TWCR=(1<<TWINT)|(1<<TWEN);
wait();
if((TWSR&0xf8)!=R_DATA_NACK) //检测状态与成功标志不符
goto last ; //出错处理
data=TWDR;
send_UART(data);
IIC_STOP();
return data;
last:
error();
}
/**************************************************/
void wait()
{
while(!(TWCR&(1<<TWINT)));
}
void delayus(unsigned char i)
{
i=5;
while(i--);
}
/**************************************************/
void error()
{
// sendstr("write error!! ");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -