📄 i2c-test.c
字号:
#include "DSP281x_Device.h"
#define Uint16 unsigned int
#define Uchar short
#define SCL GpioDataRegs.GPBDAT.bit.GPIOB14
#define SDA GpioDataRegs.GPBDAT.bit.GPIOB15
#define DELAY delay_ms(20000)
void GPIO_select(void);
void delay_ms(int x);
void delay_s(int x);
Uint16 I2C_bb(void);
void I2C_init(void);
void I2C_start(void);
void I2C_stop(void);
Uint16 I2C_ackRead(void);
void I2C_ackWrite(void);
void I2C_ackNo(void);
void I2C_writedata(Uchar ch);
Uchar I2C_readdata(void);
void I2C_writeByte(Uchar addrH,Uchar addrL,Uchar data);
Uchar I2C_readByte(Uchar addrH,Uchar addrL);
void I2C_writePage(Uchar addrH,Uchar addrL,Uchar* src,Uint16 length);
void I2C_readPage(Uchar addrH,Uchar addrL,Uchar* recv,Uint16 length);
Uchar result1,result2;
Uchar ch1=0xD0,ch2=0xE7;
Uchar send[32]={0x00,0xED,0xBF,0xC0,0xB0,0xA0,0x90,0x80,0x70,0x60,0x50,0x40,0x30,0x20,0x10,0x00,
0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,};
Uchar recv[32];
void main(void)
{
InitSysCtrl();
GPIO_select();
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
I2C_init();
I2C_writeByte(0x00,0x00,ch1);
if(ch1==I2C_readByte(0x00,0x00))
{
result1=1;
}
else
result1=0;
I2C_writePage(0x00,0x00,send,32);
delay_s(5000);
I2C_readPage(0x00,0x00,recv,32);
I2C_writeByte(0x00,0x20,ch2);
if(ch2==I2C_readByte(0x00,0x20))
result2=1;
else
result2=0;
for(;;)
{};
}
void GPIO_select(void)
{
EALLOW;
GpioMuxRegs.GPBMUX.bit.C5TRIP_GPIOB14=0;
GpioMuxRegs.GPBMUX.bit.C6TRIP_GPIOB15=0;
GpioMuxRegs.GPBDIR.bit.GPIOB14=1;
GpioMuxRegs.GPBDIR.bit.GPIOB15=1;
GpioMuxRegs.GPBQUAL.all=0x0000;
EDIS;
}
Uint16 I2C_bb(void)
{
GpioMuxRegs.GPBDIR.bit.GPIOB14=0;
GpioMuxRegs.GPBDIR.bit.GPIOB15=0;
if (SCL==1 && SDA==1)
return 0;
else
return 1;
}
void I2C_init(void)
{
SCL=0;
DELAY;
SDA=1;
DELAY;
}
void I2C_start(void)
{
SDA=1;
DELAY;
SCL=1;
DELAY;
SDA=0;
DELAY;
SCL=0;
DELAY;
}
void I2C_stop(void)
{
SDA=0;
DELAY;
SCL=1;
DELAY;
SDA=1;
DELAY;
SCL=0;
DELAY;
}
Uint16 I2C_ackRead(void)
{
Uint16 ack;
EALLOW;
GpioMuxRegs.GPBDIR.bit.GPIOB15=0;
EDIS;
DELAY;
SCL=1;
DELAY;
ack=SDA;
DELAY;
SCL=0;
DELAY;
EALLOW;
GpioMuxRegs.GPBDIR.bit.GPIOB15=1;;
EDIS;
return ack;
}
void I2C_ackWrite(void)
{
SDA=0;
DELAY;
SCL=1;
DELAY;
SCL=0;
DELAY;
}
void I2C_ackNo(void)
{
SDA=1;
DELAY;
SCL=1;
DELAY;
SCL=0;
DELAY;
}
void I2C_writedata(Uchar ch)
{
Uchar i;
for(i=0;i<8;i++)
{
if((ch<<i)&0x80)SDA=1; /*判断发送位 一位一位地发送*/
else SDA=0;
DELAY;
SCL=1;
DELAY;
SCL=0;
DELAY;
}
}
Uchar I2C_readdata()
{
int i;
Uint16 data=0;
EALLOW;
GpioMuxRegs.GPBDIR.bit.GPIOB15=0;
EDIS;
DELAY;
for(i=0;i<8;i++)
{
data=data<<1;
DELAY;
SCL=1;
DELAY;
if(SDA==1)data=data+1; /*读数据位,接收的数据位放入data中 */
DELAY;
SCL=0;
DELAY;
}
EALLOW; /*置数据线为输出方式*/
GpioMuxRegs.GPBDIR.bit.GPIOB15 =1; //SDA
EDIS;
return (data);
}
void I2C_writeByte(Uchar addrH,Uchar addrL,Uchar data)
{
I2C_start();
I2C_writedata(0xA0);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(addrH);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(addrL);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(data);
if(I2C_ackRead())
{
while(1);
}
I2C_stop();
}
Uchar I2C_readByte(Uchar addrH,Uchar addrL)
{
Uchar data=0;
I2C_start();
I2C_writedata(0xA0);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(addrH);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(addrL);
if(I2C_ackRead())
{
while(1);
}
I2C_start();
I2C_writedata(0xA1);
if(I2C_ackRead())
{
while(1);
}
data=I2C_readdata();
I2C_ackNo();
DELAY;
I2C_stop();
return data;
}
void I2C_writePage(Uchar addrH,Uchar addrL,Uchar* src,Uint16 length)
{
Uint16 i;
I2C_start();
I2C_writedata(0xA0);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(addrH);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(addrL);
if(I2C_ackRead())
{
while(1);
}
for(i=0;i<length;i++)
{
I2C_writedata(src[i]);
if(I2C_ackRead())
{
while(1);
}
}
I2C_stop();//发送停止条件启动内部写周期
}
void I2C_readPage(Uchar addrH,Uchar addrL,Uchar* recv,Uint16 length)
{
Uint16 i;
I2C_start();
I2C_writedata(0xA0);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(addrH);
if(I2C_ackRead())
{
while(1);
}
I2C_writedata(addrL);
if(I2C_ackRead())
{
while(1);
}
I2C_start();
I2C_writedata(0xA1);
if(I2C_ackRead())
{
while(1);
}
for(i=0;i<length-1;i++)
{
recv[i]=I2C_readdata();
I2C_ackWrite();
}
recv[length-1]=I2C_readdata();
I2C_ackNo();
I2C_stop();
}
void delay_ms(int x)
{
unsigned int i;
for(i = 0; i <= x; i++)
{
asm("NOP");
}
}
void delay_s(int x)
{
Uint16 i;
for(i=0;i<x;i++)
{
DELAY;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -