#include "SKEAZ1284.h"
#include "i2c.h";
#include "cpuCore.h"
void i2c_class::init(void)
{
sclk.message=0;
sclk.event=0;
sclk.state=0;
sclk.count_h=200;
sclk.count_l=180;
sda.message=0;
sda.event=0;
sda.state=0;
sda.count_h=200;
sda.count_l=180;
sda_in.message=0;
sda_in.event=0;
sda_in.state=0;
sda_in.count=140;
start.message=0;
start.event=0;
start.state=0;
stop.message=0;
stop.event=0;
stop.state=0;
noack.message=0;
noack.event=0;
noack.state=0;
ack.message=0;
ack.event=0;
ack.state=0;
read.message=0;
read.event=0;
read.state=0;
write.message=0;
write.event=0;
write.state=0;
mode_time=0;
init_p();
}
void i2c_class::write_time(void)
{
if(mode_time==0)
{
sclk.count_h=200;
sclk.count_l=180;
sda.count_h=200;
sda.count_l=180;
sda_in.count=140;
}
else
{
sclk.count_h=60;
sclk.count_l=40;
sda.count_h=60;
sda.count_l=40;
sda_in.count=60;
}
}
void i2c_class::init_p(void)
{
switch(cpu_mode)
{
case 0:
GPIOA_PDDR=GPIOA_PDDR&0xFFFFFFFB; //SDA 0 1011 输入 PTA2
PORT_PUE0=PORT_PUE0|0X00000004; //
GPIOA_PIDR=GPIOA_PIDR&0xFFFFFFFB;
GPIOA_PDDR=GPIOA_PDDR|0x04000000;//SCL=1 PTd2
PORT_PUE0=PORT_PUE0|0X04000000;
break;
case 1:
GPIOA_PDDR=GPIOA_PDDR&0xFFFFFFF7; //SDA 0 1011 输入 PTA3
PORT_PUE0=PORT_PUE0|0X00000008; //
GPIOA_PIDR=GPIOA_PIDR&0xFFFFFFF7;
GPIOA_PDDR=GPIOA_PDDR|0x08000000;//SCL=1 PTd3
PORT_PUE0=PORT_PUE0|0X08000000;
break;
case 2:
//24c512
GPIOA_PDDR=GPIOA_PDDR&0xFFFFFBFF; //SDA 0 1011 输入 PTB2
PORT_PUE0=PORT_PUE0|0X00000400; //
GPIOA_PIDR=GPIOA_PIDR&0xFFFFFBFF;
GPIOA_PDDR=GPIOA_PDDR|0x00000800;//SCL=1 PTB3
PORT_PUE0=PORT_PUE0|0X00000800;
break;
}
}
//-------------------------------------
void i2c_class::switch_sda_in(void)
{
switch(cpu_mode)
{
case 0:
GPIOA_PDDR=GPIOA_PDDR&0xFFFFFFFB; //8700 PTA2
break;
case 1:
GPIOA_PDDR=GPIOA_PDDR&0xFFFFFFF7; //2100 PTA3
break;
case 2:
GPIOA_PDDR=GPIOA_PDDR&0XFFFFFBFF; //24c512 PTB2
break;
}
}
void i2c_class::switch_sda_out(void)
{
switch(cpu_mode)
{
case 0:
GPIOA_PDDR=GPIOA_PDDR|0X00000004; //8700 PTA2
break;
case 1:
GPIOA_PDDR=GPIOA_PDDR|0X00000008; //2100 PTA3
break;
case 2:
GPIOA_PDDR=GPIOA_PDDR|0X00000400; //24c512 PTB2
break;
}
}
void i2c_class::I2C_SCLK(unsigned char c)
{
unsigned char cc;
switch(sclk.state)
{
case 0:
if(sclk.message==0xff)
{
read_shijian();
sclk.time_f=jizhu_shijian;
sclk.time_s=shijian;
if(c==0)
{
switch(cpu_mode)
{
case 0:
GPIOA_PDOR=GPIOA_PDOR|0X04000000; //8700 PTd2
break;
case 1:
GPIOA_PDOR=GPIOA_PDOR|0X08000000; //2100 PTd3
break;
case 2:
GPIOA_PDOR=GPIOA_PDOR&0XFFFFF7FF;; //24c512 PTB3
break;
}
sclk.count=sclk.count_l;
}
else
{
switch(cpu_mode)
{
case 0:
GPIOA_PDOR=GPIOA_PDOR&0XFBFFFFFF; //8700 PTD2
break;
case 1:
GPIOA_PDOR=GPIOA_PDOR&0XF7FFFFFF; //2100 PTD3
break;
case 2:
GPIOA_PDOR=GPIOA_PDOR|0X00000800; //24c512 PTB3
break;
}
sclk.count=sclk.count_h;
}
sclk.state=1;
}
break;
case 1:
cc=paiduan_shijian(sclk.time_f,sclk.time_s,sclk.count);
if(cc==0xff)
{
sclk.event=0xff;
sclk.state=0xff;
}
break;
case 0xff:
if(sclk.event==0x0)
{
sclk.state=0;
sclk.message=0;
}
break;
}
}
void i2c_class::I2C_DATA_IN(void)
{
unsigned int cc;
switch(sda_in.state)
{
case 0:
if(sda_in.message==0xff)
{
switch_sda_in();
read_shijian();
sda_in.time_f=jizhu_shijian;
sda_in.time_s=shijian;
sda_in.state=1;
}
break;
case 1:
cc=paiduan_shijian(sda_in.time_f,sda_in.time_s,sda_in.count);
if(cc==0xff)
{
sda_in.event=0xff;
sda_in.state=0xff;
cc=GPIOA_PDIR; //c=PTM;
switch(cpu_mode)
{
case 0:
cc=cc&0x04; //8700 PTA2
break;
case 1:
cc=cc&0x08; //2100 PTA3
break;
case 2:
cc=cc&0x40; //24c512 PTB2
break;
}
if(cc!=0x00)
{
cc=0xff;
}
else
{
cc=0;
}
sda_in_c=cc;
}
break;
case 0xff:
if(sda_in.event==0x0)
{
sda_in.state=0;
sda_in.message=0;
}
break;
}
}
void i2c_class::I2C_DATA_OUT(unsigned char c)
{
unsigned char cc;
switch(sda.state)
{
case 0:
if(sda.message==0xff)
{
switch_sda_out();
read_shijian();
sda.time_f=jizhu_shijian;
sda.time_s=shijian;
if(c==0)
{
switch(cpu_mode)
{
case 0:
GPIOA_PDOR=GPIOA_PDOR&0XFFFFFFFB; //8700 PTA2
break;
case 1:
GPIOA_PDOR=GPIOA_PDOR&0XFFFFFFF7; //2100 PTA3
break;
case 2:
GPIOA_PDOR=GPIOA_PDOR&0Xfffffbff; //24c512 PTB2
break;
}
sda.count=sda.count_l;
}
else
{
switch(cpu_mode)