#include "config.h"
#include "uart.h"
sfr P_SW2 = 0xba;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80)
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81)
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82)
#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83)
#define I2CSLST (*(unsigned char volatile xdata *)0xfe84)
#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85)
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87)
sbit SDA = P1^4;
sbit SCL = P1^5;
bit isda; //设备地址标志
bit isma; //存储地址标志
//unsigned char addr;
//unsigned char pdata buffer1[256];
#define I2C_CACH_BUFF_LENTH 128
static volatile unsigned char i2c_cach_pos=0;//0/1,当前数据缓存buff指示
static volatile unsigned char i2c_cach_buffer_1[I2C_CACH_BUFF_LENTH];//缓存当前数据
static volatile unsigned char i2c_cach_buffer_2[I2C_CACH_BUFF_LENTH];//缓存当前数据
static volatile unsigned char i2c_read_pos=0;//
static volatile unsigned char i2c_cmd_type=0xff;//cpu控制指令
void I2C_Isr() interrupt 24
{
_push_(P_SW2);
P_SW2 |= 0x80;
if (I2CSLST & 0x40)
{
I2CSLST &= ~0x40; //处理START事件
}
else if (I2CSLST & 0x20)
{
I2CSLST &= ~0x20; //处理RECV事件
if (isda)
{
isda = 0; //处理RECV事件(RECV DEVICE ADDR)
}
else if (isma)
{
isma = 0; //处理RECV事件(RECV MEMORY ADDR)
//addr = I2CRXD;
i2c_read_pos=0;
if(i2c_cach_pos == 0)
{
I2CTXD = i2c_cach_buffer_2[i2c_read_pos];
}
else
{
I2CTXD = i2c_cach_buffer_1[i2c_read_pos];
}
}
else
{
//buffer1[addr++] = I2CRXD; //处理RECV事件(RECV DATA)
i2c_cmd_type=I2CRXD;
}
}
else if (I2CSLST & 0x10)
{
I2CSLST &= ~0x10; //处理SEND事件
if (I2CSLST & 0x02)
{
I2CTXD = 0xff;
}
else
{
//I2CTXD = buffer1[++addr];
if(i2c_cach_pos == 0)
{
I2CTXD = i2c_cach_buffer_2[++i2c_read_pos];
}
else
{
I2CTXD = i2c_cach_buffer_1[++i2c_read_pos];
}
}
}
else if (I2CSLST & 0x08)
{
I2CSLST &= ~0x08; //处理STOP事件
isda = 1;
isma = 1;
i2c_read_pos=0;
}
_pop_(P_SW2);
}
void i2c_set_new_gpsdata(unsigned char *gps_data,unsigned char gps_len)
{
uart_printf1("gps_data:%s\r\n",gps_data);
if(i2c_cach_pos == 0)
{
memset(i2c_cach_buffer_1,0,I2C_CACH_BUFF_LENTH);
memcpy(i2c_cach_buffer_1,gps_data,gps_len);
i2c_cach_pos=1;
}
else
{
memset(i2c_cach_buffer_2,0,I2C_CACH_BUFF_LENTH);
memcpy(i2c_cach_buffer_2,gps_data,gps_len);
i2c_cach_pos=0;
}
}
void I2C_init()
{
i2c_cach_pos=0;
memset(i2c_cach_buffer_1,0,I2C_CACH_BUFF_LENTH);
memset(i2c_cach_buffer_2,0,I2C_CACH_BUFF_LENTH);
P1M0 = 0xcf; //0xce
P1M1 = 0xcf; //0xcd
P_SW2 = 0x80;
I2CCFG = 0x81; //使能I2C从机模式
I2CSLADR = 0x5a; //设置从机设备地址为5A
I2CSLST = 0x00;
I2CSLCR = 0x78; //使能从机模式中断
EA = 1;
isda = 1; //用户变量初始化
isma = 1;
I2CTXD =0;
}