?? i2c.c
字號(hào):
#include "datadef.h" //定義數(shù)據(jù)結(jié)構(gòu)
#include "54regs.h" //54寄存器定義
/***************************************************************************/
/* */
/* SEND_DATA */
/* */
/* */
/* */
/***************************************************************************/
struct VZ_DATA* vz_rom_data =(struct VZ_DATA*)0x350;
void set_sda(void)
{
*MCBSP0_SPSA=MCBSP_PCR;
*MCBSP0_SPSD=*MCBSP0_SPSD|0x8;
}
void reset_sda(void)
{
*MCBSP0_SPSA=MCBSP_PCR;
*MCBSP0_SPSD=*MCBSP0_SPSD&0xfff7;
}
void set_sclk(void)
{
*MCBSP0_SPSA=MCBSP_PCR;
*MCBSP0_SPSD=*MCBSP0_SPSD|0x2;
}
void reset_sclk(void)
{
*MCBSP0_SPSA=MCBSP_PCR;
*MCBSP0_SPSD=*MCBSP0_SPSD&0xfffd;
}
int read_sda(void)
{
int xc;
*MCBSP0_SPSA=MCBSP_PCR;
xc=*MCBSP0_SPSD&0x8;
if (xc)
{
return (1);
}
else
{
return (0);
}
}
void START_I2C(void)
{
set_sda();
delay(100);
set_sclk();
delay(100);
reset_sda();
delay(100);
reset_sclk();
delay(100);
}
void STOP_I2C(void)
{
reset_sda();
delay(100);
set_sclk();
delay(100);
set_sda();
delay(100);
}
void WRITE_BYTE(int byte)
{
int nu=8;
while (nu)
{
reset_sclk();
delay(100);
if (byte&0x8000)
set_sda();
else
reset_sda();
byte<<=1;
delay(100);
set_sclk();
delay(100);
nu--;
}
reset_sclk();
delay(100);
}
int READ_BYTE(void)
{
int num=8,byte=0,c;
reset_sclk();
*MCBSP0_SPSD=*MCBSP0_SPSD&0xf7ff;
delay(100);
while (num)
{
delay(100);
set_sclk();
delay(100);
c=read_sda();
byte+=c;
byte<<=1;
reset_sclk();
num--;
}
byte>>=1;
*MCBSP0_SPSD=*MCBSP0_SPSD|0x800;
delay(100);
return(byte);
}
void CLOCK(void)
{
int err;
*MCBSP0_SPSD=*MCBSP0_SPSD&0xf7ff;
delay(10);
set_sclk();
delay(100);
err=1;
while (read_sda()&&err)
{
err--;
}
delay(100);
reset_sclk();
*MCBSP0_SPSD=*MCBSP0_SPSD|0x800;
delay(100);
}
int read_e2rom(int add)
{
int byte;
START_I2C();
WRITE_BYTE(0x0ae00);
CLOCK();
WRITE_BYTE(0x0000);
CLOCK();
WRITE_BYTE(add);
CLOCK();
START_I2C();
WRITE_BYTE(0x0af00);
CLOCK();
byte=READ_BYTE();
STOP_I2C();
return(byte);
}
int read16_e2rom(int add)
{
int byte;
START_I2C();
WRITE_BYTE(0x0ae00);
CLOCK();
WRITE_BYTE(0x0000);
CLOCK();
WRITE_BYTE(add);
CLOCK();
START_I2C();
WRITE_BYTE(0x0af00);
CLOCK();
byte=READ_BYTE();
STOP_I2C();
delay(100);
long_delay(200);
START_I2C();
WRITE_BYTE(0x0ae00);
CLOCK();
WRITE_BYTE(0x0000);
CLOCK();
WRITE_BYTE(add+0x100);
CLOCK();
START_I2C();
WRITE_BYTE(0x0af00);
CLOCK();
byte=byte<<8;
byte+=READ_BYTE();
STOP_I2C();
return(byte);
}
void write16_e2rom(int add,int byte)
{
int c;
c=byte;
byte&=0x0ff00;
START_I2C();
WRITE_BYTE(0x0ae00);
CLOCK();
WRITE_BYTE(0x0000);
CLOCK();
WRITE_BYTE(add);
CLOCK();
WRITE_BYTE(byte);
CLOCK();
STOP_I2C();
long_delay(200);
byte=c;
byte&=0x0ff;
byte=byte<<8;
START_I2C();
WRITE_BYTE(0x0ae00);
CLOCK();
WRITE_BYTE(0x0000);
CLOCK();
WRITE_BYTE(add+0x100);
CLOCK();
WRITE_BYTE(byte);
CLOCK();
STOP_I2C();
long_delay(200);
}
void ccr_w(int add,int bt)
{
START_I2C();
WRITE_BYTE(0xde00);
CLOCK();
WRITE_BYTE(0x0000);
CLOCK();
WRITE_BYTE(add);
CLOCK();
WRITE_BYTE(bt);
CLOCK();
STOP_I2C();
long_delay(200);
}
void I2C_INIT(void)
{
set_sclk();
delay(100);
set_sda();
delay(100);
}
void read_vz(void)
{
*MCBSP0_SPSA=MCBSP_SPCR1; /*配置MCBSP0為通用IO方式*/
*MCBSP0_SPSD=0x0;
*MCBSP0_SPSA=MCBSP_SPCR2;
*MCBSP0_SPSD=0x0;
*MCBSP0_SPSA=MCBSP_PCR;
*MCBSP0_SPSD=0x2a00;
I2C_INIT();
ccr_w(0x3f00,0x0200);
ccr_w(0x3f00,0x0600);
(*vz_rom_data).U=read16_e2rom(0x8000);
(*vz_rom_data).change=read16_e2rom(0x8200);
(*vz_rom_data).TYPE_IDEN=read16_e2rom(0x8400);
(*vz_rom_data).D_U[0]=read16_e2rom(0x8600);
(*vz_rom_data).D_U[1]=read16_e2rom(0x8800);
(*vz_rom_data).D_U[2]=read16_e2rom(0x8a00);
(*vz_rom_data).D_U[3]=read16_e2rom(0x8c00);
(*vz_rom_data).D_I[0]=read16_e2rom(0x8e00);
(*vz_rom_data).D_I[1]=read16_e2rom(0x9000);
(*vz_rom_data).D_I[2]=read16_e2rom(0x9200);
(*vz_rom_data).A_U[0]=read16_e2rom(0x9400);
(*vz_rom_data).A_U[1]=read16_e2rom(0x9600);
(*vz_rom_data).A_U[2]=read16_e2rom(0x9800);
(*vz_rom_data).A_U[3]=read16_e2rom(0x9a00);
(*vz_rom_data).A_I[0]=read16_e2rom(0x9c00);
(*vz_rom_data).A_I[1]=read16_e2rom(0x9e00);
(*vz_rom_data).A_I[2]=read16_e2rom(0xa000);
}
void write_vz(void)
{
*MCBSP0_SPSA=MCBSP_SPCR1; /*配置MCBSP0為通用IO方式*/
*MCBSP0_SPSD=0x0;
*MCBSP0_SPSA=MCBSP_SPCR2;
*MCBSP0_SPSD=0x0;
*MCBSP0_SPSA=MCBSP_PCR;
*MCBSP0_SPSD=0x2a00;
I2C_INIT();
ccr_w(0x3f00,0x0200);
ccr_w(0x3f00,0x0600);
write16_e2rom(0x8000,(*vz_rom_data).U);
long_delay(200);
write16_e2rom(0x8200,(*vz_rom_data).change);
long_delay(200);
write16_e2rom(0x8400,(*vz_rom_data).TYPE_IDEN);
long_delay(200);
write16_e2rom(0x8600,(*vz_rom_data).D_U[0]);
long_delay(200);
write16_e2rom(0x8800,(*vz_rom_data).D_U[1]);
long_delay(200);
write16_e2rom(0x8a00,(*vz_rom_data).D_U[2]);
long_delay(200);
write16_e2rom(0x8c00,(*vz_rom_data).D_U[3]);
long_delay(200);
write16_e2rom(0x8e00,(*vz_rom_data).D_I[0]);
long_delay(200);
write16_e2rom(0x9000,(*vz_rom_data).D_I[1]);
long_delay(200);
write16_e2rom(0x9200,(*vz_rom_data).D_I[2]);
long_delay(200);
write16_e2rom(0x9400,(*vz_rom_data).A_U[0]);
long_delay(200);
write16_e2rom(0x9600,(*vz_rom_data).A_U[1]);
long_delay(200);
write16_e2rom(0x9800,(*vz_rom_data).A_U[2]);
long_delay(200);
write16_e2rom(0x9a00,(*vz_rom_data).A_U[3]);
long_delay(200);
write16_e2rom(0x9c00,(*vz_rom_data).A_I[0]);
long_delay(200);
write16_e2rom(0x9e00,(*vz_rom_data).A_I[1]);
long_delay(200);
write16_e2rom(0xa000,(*vz_rom_data).A_I[2]);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -