📄 twihc2.c
字号:
#include <iom88v.h>
#include <macros.h>
//v2
#define LCD_BG_OFF PORTB |= BIT(PB5)
typedef unsigned char uint8;
typedef unsigned int uint16;
/*
typedef union reccnt
{
uint16 rcnt;
uint8 rcntl[2];
}LngToChar;
*/
//******************************************
union _my_int
{
uint16 IntV;
uint8 i[2];
};
#define wr_24c256_add 0xA0
#define rd_24c256_add 0xA1
#define rd_372device_add 0x65
#define wr_372device_add 0x64
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
//#define MT_SLA_ACK 0x38
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait() {while(!(TWCR&(1<<TWINT)));}
#define TestAck() (TWSR&0xf8)
#define SetAck() (TWCR|=(1<<TWEA))
#define SetNoAck() (TWCR&=~(1<<TWEA))
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
void Init_TWI(void);
unsigned char TWI_WriteByte(uint8 Wdata,uint16 RomAddress);//O0
unsigned char TWI_ReadByte (uint16 RomAddress);
extern void delay_nms(unsigned int time);
extern unsigned char B_372;
//unsigned char B_256=0;
void Init_TWI(void)
{
(PRR&=~(1<<PRTWI));
TWBR=0x16; //TWBR=0x16;TWBR=0x12;
TWSR=00; //设置TWI时钟50K
}
//******************************************
unsigned char TWI_WriteByte(uint8 Wdata,uint16 RomAddress)
{
//unsigned char ACK_A=0;
unsigned char *Pr;
union _my_int k;
CLI(); //关闭所有中断
if(B_372==0)PORTD &= ~BIT(PD5);else PORTD |= BIT(PD5); //容许写数据}//
delay_nms(5);//16
k.IntV=RomAddress;
Pr=&k.i[1]; //先写高位地址再写底位地址
//PORTD &= ~BIT(PD5);//容许写数据
//CLI(); //关闭所有中断
Start();//TWI启动
Wait();
if(TestAck()!=START) return 1;//ACK
if(B_372==1){Write8Bit(wr_372device_add);}//
else {Write8Bit(wr_24c256_add);}
//Write8Bit(wr_eepdevice_add);//写TWI从器件地址和写方式
Wait();
//ACK_A=TestAck();//HHHHH
if(TestAck()!=MT_SLA_ACK) return 1;//ACK
//Pr--;
if(B_372==0)//时钟
{
Write8Bit(*Pr);//写24C256的ROM地址 h
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK 0x28
Pr--;
Write8Bit(*Pr);//写24C256的ROM地址 l
}
else Write8Bit(RomAddress); //存储器
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK
Write8Bit(Wdata);//写数据到24C256的ROM
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK
Stop();//TWI停止
//delay_nms(10);//延时等EEPROM写完
//delay_nms(5);//16
SEI(); //使能全局中断
PORTD |= BIT(PD5);//写保护
return 0;
}
//******************************************
unsigned char TWI_ReadByte(uint16 RomAddress)
{
unsigned char temp;
unsigned char *P;
union _my_int k;
CLI(); //关闭所有中断
//PORTD |= BIT(PD5);//写保护
k.IntV=RomAddress;
P=&k.i[1]; //先写高位地址再写底位地址
//CLI(); //关闭所有中断
Start();//TWI启动
Wait();
if (TestAck()!=START) return 0;//ACK
if(B_372==1){Write8Bit(wr_372device_add);}//
else {Write8Bit(wr_24c256_add);}//
//if(B_372==1) {Write8Bit(rd_372device_add);}//写TWI从器件地址和写方式
//else {Write8Bit(rd_24c256_add);}// 写TWI从器件地址和写方式
//Write8Bit(wr_eepdevice_add);//写TWI从器件地址和写方式
Wait();
if (TestAck()!=MT_SLA_ACK) return 0;//ACK
//P--;
if(B_372==0)//
{
Write8Bit(*P);//写24C256的ROM地址 h
Wait();
if (TestAck()!=MT_DATA_ACK) return 0;
P--;
Write8Bit(*P);//写24C256的ROM地址 l
}
else Write8Bit(RomAddress); //写372
Wait();
if (TestAck()!=MT_DATA_ACK) return 0;
Start();//TWI重新启动
Wait();
if (TestAck()!=RE_START) return 0;
if(B_372==1) {Write8Bit(rd_372device_add);}//写TWI从器件地址和读方式
else {Write8Bit(rd_24c256_add);}// 写TWI从器件地址和读方式
//Write8Bit(rd_eepdevice_add);//写TWI从器件地址和读方式
Wait();
if(TestAck()!=MR_SLA_ACK) return 0;//ACK
Twi();//启动主TWI读方式
Wait();
if(TestAck()!=MR_DATA_NOACK) return 0;//ACK
temp=TWDR;//读取TWI接收数据
Stop();//TWI停止
SEI(); //使能全局中断
return temp;
}
//////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -