📄 main.c
字号:
#include "DSP28_Device.h"
#define uint unsigned int
#define uchar short
#define SCL GpioDataRegs.GPBDAT.bit.GPIOB14
#define SDA GpioDataRegs.GPBDAT.bit.GPIOB15
#define SCL_OUT (GpioMuxRegs.GPBDIR.bit.GPIOB14=1)
#define SDA_OUT (GpioMuxRegs.GPBDIR.bit.GPIOB15=1)
#define SCL_IN (GpioMuxRegs.GPBDIR.bit.GPIOB14=0)
#define SDA_IN (GpioMuxRegs.GPBDIR.bit.GPIOB15=0)
#define tip 20000
#define CtrlW 0xA0
#define CtrlR 0xA1
void GPIO_Config(void);
void delay_ms(int x);
void delay_s(int x);
uint IIC_bb(void);
void IIC_init(void);
void IIC_start(void);
void IIC_stop(void);
uint IIC_ackRead(void);
void IIC_ackWrite(void);
void IIC_ackNo(void);
void IIC_write(uchar ch);
void IIC_writeByte(uchar control,uchar addrH,uchar addrL,uchar data);
uchar IIC_readByte(uchar control,uchar addrH,uchar addrL);
void IIC_writePage(uchar control,uchar addrH,uchar addrL,uchar* src,uint length);
void IIC_readPage(uchar control,uchar addrH,uchar addrL,uchar* dst,uint length);
uchar result1,result2;
uchar ch1=0xD0,ch2=0xE7;
uchar var_send[32]={0xF0,0xE0,0xD0,0xC0,0xB0,0xA0,0x90,0x80,0x70,0x60,0x50,0x40,0x30,0x20,0x10,0x00,
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,};
uchar var_recv[32];
void main(void)
{
InitSysCtrl();
GPIO_Config();
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
IIC_init();
IIC_writeByte(CtrlW,0x00,0x00,ch1);
if(ch1==IIC_readByte(CtrlR,0x00,0x00))
{
result1=1;
}
else
result1=0;
IIC_writePage(CtrlW,0x00,0x00,var_send,32);
delay_s(5000);
IIC_readPage(CtrlR,0x00,0x00,var_recv,32);
IIC_writeByte(CtrlW,0x00,0x20,ch2);
if(ch2==IIC_readByte(CtrlR,0x00,0x20))
result2=1;
else
result2=0;
for(;;)
{};
}
void GPIO_Config(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;
}
uint IIC_bb(void)
{
SCL_IN;
SDA_IN;
if (SCL==1 && SDA==1)
return 0;
else
return 1;
}
void delay_ms(int x)
{
unsigned int i;
for(i = 0; i <= x; i++)
{
asm("NOP");
}
}
void delay_s(int x)
{
uint i;
for(i=0;i<x;i++)
{
delay_ms(tip);
}
}
void IIC_init(void)
{
SCL=0;
delay_ms(tip);
SDA=1;
delay_ms(tip);
}
void IIC_start(void)
{
SDA=1;
delay_ms(tip);
SCL=1;
delay_ms(tip);
SDA=0;
delay_ms(tip);
SCL=0;
delay_ms(tip);
}
void IIC_stop(void)
{
SDA=0;
delay_ms(tip);
SCL=1;
delay_ms(tip);
SDA=1;
delay_ms(tip);
SCL=0;
delay_ms(tip);
}
uint IIC_ackRead(void)
{
uint i;
// SCL=0;
// delay_ms(tip);
EALLOW;
SDA_IN;
EDIS;
delay_ms(tip);
SCL=1;
delay_ms(tip);
i=SDA;
delay_ms(tip);
SCL=0;
delay_ms(tip);
EALLOW;
SDA_OUT;
EDIS;
return i;
}
void IIC_ackWrite(void)
{
SDA=0;
delay_ms(tip);
SCL=1;
delay_ms(tip);
SCL=0;
delay_ms(tip);
}
void IIC_ackNo(void)
{
SDA=1;
delay_ms(tip);
SCL=1;
delay_ms(tip);
SCL=0;
delay_ms(tip);
}
void IIC_write(uchar ch)
{
uchar i;
// SCL=0;
// delay_ms(tip);
for(i=7;i>=0;i--)
{
SDA= ((ch >> i) & 1);//先发送数据的高位
delay_ms(tip);
SCL=1;
delay_ms(tip);
SCL=0;
delay_ms(tip);
}
}
void IIC_writeByte(uchar control,uchar addrH,uchar addrL,uchar data)
{
uint i;
IIC_start();
IIC_write(control);
if(IIC_ackRead())
{
while(1);
}
IIC_write(addrH);
if(IIC_ackRead())
{
while(1);
}
IIC_write(addrL);
if(IIC_ackRead())
{
while(1);
}
IIC_write(data);
if(IIC_ackRead())
{
while(1);
}
IIC_stop();
}
uchar IIC_readByte(uchar control,uchar addrH,uchar addrL)
{
uchar i=8,j=0;
uchar data=0;
control=control&0xFE;
IIC_start();
IIC_write(control);
if(IIC_ackRead())
{
while(1);
}
IIC_write(addrH);
if(IIC_ackRead())
{
while(1);
}
IIC_write(addrL);
if(IIC_ackRead())
{
while(1);
}
control=control|1;
IIC_start();
IIC_write(control);
if(IIC_ackRead())
{
while(1);
}
for(i=0;i<8;i++)
{
SCL=1;
delay_ms(tip);
EALLOW;
SDA_IN;
EDIS;
delay_ms(tip);
j=SDA;
data=data|(j<<(7-i));
delay_ms(tip);
SCL=0;
delay_ms(tip);
}
EALLOW;
SDA_OUT;
EDIS;
IIC_ackNo();
delay_ms(tip);
IIC_stop();
return data;
}
void IIC_writePage(uchar control,uchar addrH,uchar addrL,uchar* src,uint length)
{
uint i;
IIC_start();
IIC_write(control);
if(IIC_ackRead())
{
while(1);
}
IIC_write(addrH);
if(IIC_ackRead())
{
while(1);
}
IIC_write(addrL);
if(IIC_ackRead())
{
while(1);
}
for(i=0;i<length;i++)
{
IIC_write(src[i]);
if(IIC_ackRead())
{
while(1);
}
}
IIC_stop();//发送停止条件启动内部写周期
}
void IIC_readPage(uchar control,uchar addrH,uchar addrL,uchar* dst,uint length)
{
uint i,j;
volatile uchar k=0,temp=0;
control=control&0xFE;
IIC_start();
IIC_write(control);
if(IIC_ackRead())
{
while(1);
}
IIC_write(addrH);
if(IIC_ackRead())
{
while(1);
}
IIC_write(addrL);
if(IIC_ackRead())
{
while(1);
}
control=control|1;
IIC_start();
IIC_write(control);
if(IIC_ackRead())
{
while(1);
}
EALLOW;
SDA_IN;
EDIS;
delay_ms(tip);
for(j=0;j<8;j++)
{
SCL=1;
delay_ms(tip);
k=SDA;
delay_ms(tip);
temp=(k<<(7-j))|temp;
SCL=0;
delay_ms(tip);
}
dst[0]=temp;
for(i=1;i<length;i++)
{
EALLOW;
SDA_OUT;
EDIS;
delay_ms(tip);
IIC_ackWrite();
EALLOW;
SDA_IN;
EDIS;
delay_ms(tip);
k=0;
temp=0x00;
for(j=0;j<8;j++)
{
SCL=1;
delay_ms(tip);
k=SDA;
delay_ms(tip);
temp=(k<<(7-j))|temp;
SCL=0;
delay_ms(tip);
}
dst[i]=temp;
}
EALLOW;
SDA_OUT;
EDIS;
IIC_ackNo();
IIC_stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -