📄 iic.c
字号:
///////////////////////////////////////////////////
///////////////////////////////////////////////////
#include "mcbsp.h"
void SCL_High(void);
void SCL_Low(void);
void SDA_High(void);
void SDA_Low(void);
void delay_us(int m);
/*****************Debug Specifcation************************/
/**cause DX2 (Output only)use as SDA1 ,Debug IIC2 First *******/
void IIC_Init(void)
{
/***Set R/XRST =0 in SPCR1/2 when Use as gpio***/
*(SPSA2)=SPCR1;
*(SPSD2)&=0xFFFE;
*(SPSA2)=SPCR2;
*(SPSD2)&=0xFFFE;
*(SPSA2)=PCR;
*(SPSD2)=0xFFFF;//all ouput and all high
}
void IIC_Star(void)
{
SCL_High();//SCL=H
delay_us(5);
SDA_High();//SDA=H
delay_us(5);
SDA_Low();//SDA=L
delay_us(5);
SCL_Low();//SCL=L
delay_us(5);
}
void IIC_Stop(void)
{
SCL_High();//SCL=H
delay_us(5);
SDA_Low();//SDA=L
delay_us(5);
SDA_High();//SDA=H
delay_us(5);
SCL_Low();//SCL=L
delay_us(5);
SCL_High();//SCL=H
}
void IIC_Slave_Ack(void)//SDA1:USE DX pin,can not reback,but SD2 can.
{int IIC_D;
SDA_Low();//SDA=L
delay_us(2);
SCL_High();//SCL=H
delay_us(5);
*(SPSA2)=PCR;
*(SPSD2)&=0xFEFF;//CLKRM=0,set input
delay_us(5);
IIC_D=(*SPSD2)&(0x0001);//Read form SDA2
do
{
}while (IIC_D);//chech Slave device ack.
SCL_Low();//SCL=L
delay_us(5);
}
void IIC_Master_Ack(void)
{
}
void IIC_Write(char data)
{ char i;
char SDA;
SCL_Low();//SCL=L,SDA change only when SCL=L
delay_us(5);
/******Sending data form MSB to LSB*******************/
for( i=0; i<8; i++ )
{
SDA=data & 0x80;
if (SDA)
{
SDA_High();//SDA=H
delay_us(5);
}
else
{
SDA_Low();//SDA=L
delay_us(5);
}
data<<=1;
SCL_High();//SCL=L
delay_us(5);
SCL_Low();//SCL=L
delay_us(5);
}
}
void Set_IIC(char addr,char cmmd,char data)
{
//======addr=0101A3A2A1A0========
//==cmmd:here Write WCR=1010(P1P0)xx=1010(P1P0)00===========
//==data=CM DW D5...D0=00 D5...D0=========
IIC_Star();
IIC_Write( addr);
IIC_Slave_Ack();
delay_us(15);
IIC_Write( cmmd);
IIC_Slave_Ack();
IIC_Write( data);
IIC_Slave_Ack();
IIC_Stop();
}
/*****************PCR*********************/
/*Bit15-12:xx XIOEN RIOEN *//*GPIO: X/RIOEN=1 in PCR */
/*Bit11-8: FSXM FSRM CLKXM CLKRM *//*Direction==>set 1,Output,Set 0 :input*/
/*Bit7:4: x CLKS_STAT DX_STAT DR_STAT *//*Value reflag on pin*/
/***********x****x******SDA1******x***********/
/*Bit3:0 FSXP FSRP CLKXP CLKRP *//*Value reflag on pin*/
/**********SCL2 x SCL1 SDA2*****************/
/****************************************/
void SCL_High(void)//SCL1:CLKX2,SCL2:FSX2
{
*(SPSA2)=PCR;
*(SPSD2)|=0x000A;//FSXP=CLKXP=H
}
void SCL_Low(void)
{
*(SPSA2)=PCR;
*(SPSD2)&=0xFFF5;//FSXP=CLKXP=L
}
void SDA_High(void)
{
*(SPSA2)=PCR;
*(SPSD2)|=0xFF21;//DX_STAT=CLKRP=H
}
void SDA_Low(void)
{
*(SPSA2)=PCR;
*(SPSD2)&=0xFFDE;//DX_STAT=CLKRP=L
}
void delay_us(int m)//m us
{
int i;
int N=m*25;
for (i=0;i<N;i++)
{
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -