📄 drv_i2c.i
字号:
#line 1 "src\\drv_I2C.c"
#line 1 "src\\system.h"
#line 1 "src\\target.h"
extern void Reset(void);
extern void TargetInit(void);
#line 12 "src\\system.h"
#line 1 "src\\sys_init.h"
extern void init_sys(void);
extern void init_io(void);
extern void init_clock(void);
extern void init_timer0(void);
extern void init_timer1(void);
extern void init_int0(void);
extern void init_int2(void);
#line 14 "src\\system.h"
#line 7 "src\\drv_I2C.c"
volatile uint8 I2C_sla;
volatile uint8 I2C_suba;
volatile uint8 *I2C_buf;
volatile uint8 I2C_num;
volatile uint8 I2C_end;
volatile uint8 I2C_suba_en;
void __irq IRQ_I2C(void)
{ uint8 sta;
sta = I2STAT;
switch(sta)
{ case 0x08:
if(1==I2C_suba_en) I2DAT = I2C_sla&0xFE;
else I2DAT = I2C_sla;
I2CONCLR = 0x28;
break;
case 0x10:
I2DAT = I2C_sla;
I2CONCLR = 0x28;
break;
case 0x18:
if(0==I2C_suba_en)
{ if(I2C_num>0)
{ I2DAT = *I2C_buf++;
I2CONCLR = 0x28;
I2C_num--;
}
else
{ I2CONSET = 0x10;
I2CONCLR = 0x28;
I2C_end = 1;
}
break;
}
if(1==I2C_suba_en)
{ I2DAT = I2C_suba;
I2CONCLR = 0x28;
}
if(2==I2C_suba_en)
{ I2DAT = I2C_suba;
I2CONCLR = 0x28;
I2C_suba_en = 0;
}
break;
case 0x28:
if(0==I2C_suba_en)
{ if(I2C_num>0)
{ I2DAT = *I2C_buf++;
I2CONCLR = 0x28;
I2C_num--;
}
else
{ I2CONSET = 0x10;
I2CONCLR = 0x28;
I2C_end = 1;
}
break;
}
if(1==I2C_suba_en)
{ I2CONSET = 0x20;
I2CONCLR = 0x08;
I2C_suba_en = 0;
}
break;
case 0x20:
case 0x30:
case 0x38:
I2CONCLR = 0x28;
I2C_end = 0xFF;
break;
case 0x40:
if(1==I2C_num)
{ I2CONCLR = 0x2C;
}
else
{ I2CONSET = 0x04;
I2CONCLR = 0x28;
}
break;
case 0x50:
*I2C_buf++ = I2DAT;
I2C_num--;
if(1==I2C_num)
{ I2CONCLR = 0x2C;
}
else
{ I2CONSET = 0x04;
I2CONCLR = 0x28;
}
break;
case 0x58:
*I2C_buf++ = I2DAT;
I2CONSET = 0x10;
I2CONCLR = 0x28;
I2C_end = 1;
break;
case 0x48:
I2CONCLR = 0x28;
I2C_end = 0xFF;
break;
default:
break;
}
VICVectAddr = 0x00;
}
uint8 ISendStr( uint8 suba, uint8 *s, uint8 no)
{
I2C_sla = 0xa0;
I2C_suba = suba;
I2C_buf = s;
I2C_num = no;
I2C_suba_en = 2;
I2C_end = 0;
I2CONCLR = 0x2C;
I2CONSET = 0x60;
while(0==I2C_end);
if(1==I2C_end) return(1);
else return(0);
}
uint8 IRcvStr(uint8 suba,uint8 *s,uint8 no)
{ if(0==no) return(0);
I2C_sla = 0xa1;
I2C_suba = suba;
I2C_buf = s;
I2C_num = no;
I2C_suba_en = 1;
I2C_end = 0;
I2CONCLR = 0x2C;
I2CONSET = 0x60;
while(0==I2C_end);
if(1==I2C_end) return(1);
else return(0);
}
void ee_write (uint8 address,uint16 value)
{
uint8 i;
uint8 data[2];
uint8 data_buf[2];
data[0]=value;
data[1]=value>>8;
for(i=0; i<2; i++) data_buf[i] =data[i] ;
ISendStr( address, data_buf, 2);
}
uint16 ee_read(uint8 address)
{
uint8 i;
uint8 read_buf[2];
uint16 read_value;
for(i=0; i<2; i++) read_buf[i] = 0;
IRcvStr( address, read_buf, 2);
read_value=(read_buf[1]<<8)|read_buf[0];
return(read_value);
}
uint8 read_buf1[2];
uint16 k;
void i2ctest(void)
{
ee_write(0x09,0x838E);
DelayNS(1);
k= 0x838e;
read_buf1[0]=k;
read_buf1[1]=k>>8;
while(1)
{
UART0_SendByte(read_buf1[0]);
UART0_SendByte(read_buf1[1]);
DelayNS(200);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -