📄 iic.c
字号:
/******************************************************************************************************
文件名:iic.c
编写者:WANGYUBO
描述:iic总线的子程序。
版本:2006年4月6日 1.0
*****************************************************************************************************/
#include <msp430x44x.h>
//#include "24c02.h"
#include "iic.h"
//#include "general.h"
void Init8025() //初始化8025时钟芯片
{ unsigned char j,*clkdata,i,jjj[16];
unsigned long tmp;
//P1DIR |= 0x80;
//P1OUT |= 0X80;
//P2DIR |= 0X01;
//P2OUT |= 0X01;
//P1OUT &= ~0X80;
//P2OUT &= ~0X01;
InitIIC();
i=0;
jjj[0] = 0x50;
jjj[1] = 0x59;
jjj[2] = 0x23;
jjj[3] = 0x01;
jjj[4] = 0x31;
jjj[5] = 0x12;
jjj[6] = 0x06;
jjj[7] = 0x00;
jjj[8] = 0x00;
jjj[9] = 0x00;
jjj[10] = 0x00;
jjj[11] = 0x00;
jjj[12] = 0x00;
jjj[13] = 0x00;
jjj[14] = 0x20;
jjj[15] = 0x00;
Write8025(jjj,0,16);
return;
while(1)
{
if(i != jjj[0])
{
i = jjj[0];
LedOn();
for(tmp=0;tmp<8000;tmp++);
LedOff();
}
//j = Read8025_3(jjj);
j = Read8025(jjj,0,16);
}
}
/***************************************************************************
初始化IIC
***************************************************************************/
void InitIIC()
{
//IIC_DIR |= IIC_SCL; //SCL管脚为输出
//IIC_DIR &= ~IIC_SDA; //SDA管脚为输入
SDA_DIR;
SCL_DIR;
C_SCL;
Stop();
}
/***************************************************************************
进行短暂的延时,原因是MSP430的速度比较快。使用者可以根据时钟频率自行调节延时长短
***************************************************************************/
void delay()
{
unsigned int q0;
for(q0=0;q0<200;q0++)
{
_NOP();
}
}
/**************************************************************************/
void DelayMs(unsigned char DMS)
{unsigned int temp;
while(DMS>0)
{
for(temp=0;temp<800;temp++);
DMS--;
}
}
/***************************************************************************
启动IIC总线
***************************************************************************/
void Start()
{
S_SCL; //scl high
delay();
SDA_OUT; //SDA HIGN
S_SDA;
delay();
C_SDA; //SDA LOW
delay();
C_SCL;
delay(); //SCL LOW
}
/***************************************************************************
停止操作,释放IIC总线
***************************************************************************/
void Stop()
{
S_SCL; //SCL HIGH
delay();
SDA_OUT; //
C_SDA; //C_SCL;
delay();
S_SDA;
delay();
//delay();
}
/***************************************************************************
IIC总线应答
***************************************************************************/
void Ack()
{
SDA_OUT;
C_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
S_SDA;
}
/***************************************************************************
IIC总线无应答
***************************************************************************/
void NoAck()
{
SDA_OUT;
S_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
}
/***************************************************************************
IIC总线检验应答
返回值:IIC应答位的值0:应答 1:无应答
***************************************************************************/
unsigned char TestAck()
{
unsigned char ack;
S_SCL;
delay();
SDA_IN;
delay();
ack=READ_SDA;
delay();
C_SCL;
delay();
return(ack);
}
/***************************************************************************
IIC总线写8位数据
input:要写的8位数据
***************************************************************************/
void Write8Bit(unsigned char input)
{
unsigned char temp,q0;
SDA_OUT;
for(temp=8;temp!=0;temp--)
{
q0=input&0x80;
if(q0==0x80)
S_SDA;
else
C_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
input=input<<1;
}
}
/***************************************************************************
IIC总线读8位数据
返回值:读出的8位数据
***************************************************************************/
unsigned char Read8Bit()
{
unsigned char temp,q0,rbyte=0;
SDA_IN;
for(temp=8;temp!=0;temp--)
{
S_SCL;
delay();
rbyte=rbyte<<1;
SDA_IN;
q0=READ_SDA;
if(q0==IIC_SDA)
rbyte=rbyte|0x1;
delay();
C_SCL;
delay();
}
return(rbyte);
}
/***************************************************************************
向8025中写多个字节
psrc_data:指向要写入数据数组的指针
adr:8025中要写入数据的首地址
nbyte:写入的字节数
返回值: 0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Write8025(unsigned char* psrc_data,unsigned char adr,unsigned char nbyte)
{
Start(); //启动IIC总线
Write8Bit(W_DEVICE_ADR); //写8025芯片地址以及确定下面执行写操作
if(TestAck()==1) //检验应答
return 1; //若应答错误,则退出函数,返回错误
Write8Bit(adr*0x10); //写对8025操作的地址
if(TestAck()==1)
return 1;
while(nbyte != 0)
{
Write8Bit(*psrc_data); //向8025中写数据
if(TestAck()==1)
return 1;
psrc_data++; //指向待写数据的指针加1
nbyte--;
}
Stop(); //停止IIC总线
DelayMs(10); //写入延时
return 0;
}
/***************************************************************************
从8025中读一个字节
pdin_data:指向要保存读出数据的变量的指针
adr:8025中要读出数据的地址
返回值: 0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Read8025Byte(unsigned char *pdin_data,unsigned char adr)
{
Start(); //启动IIC总线
Write8Bit(W_DEVICE_ADR); //写8025的芯片地址以及确定下面执行写操作
if(TestAck()==1)
return 1;
Write8Bit(adr*0x10 + 4); //写对8025操作的地址
if(TestAck()==1)
return 1;
// Start(); //再次启动IIC总线
// Write8Bit(R_DEVICE_ADR); //写8025的芯片地址以及确定下面执行读操作
// if(TestAck()==1)
// return 1;
*pdin_data=Read8Bit(); //从8025中读数据,存入pdin_data所指的存储器中
NoAck(); //IIC无应答操作
Stop(); //停止IIC总线
DelayMs(1);
return 0;
}
/***************************************************************************
从8025读多个字节
pdin_data:指向要保存读出数据的数组的指针
adr:8025中要读出数据的首地址
nbyte:读出的字节数
返回值: 0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Read8025(unsigned char *pdin_data,unsigned char adr,unsigned char nbyte)
{
Start(); //启动IIC总线
Write8Bit(W_DEVICE_ADR); //写8025的芯片地址以及确定下面执行写操作
if(TestAck()==1)
return 1;
Write8Bit(adr*0x10+4); //写8025操作的地址
if(TestAck()==1)
return 1;
// Start(); //再次启动IIC总线
// Write8Bit(R_DEVICE_ADR); //写8025的芯片地址以及确定下面执行读操作
// if(TestAck()==1)
// return 1;
while(nbyte!=1)
{
*pdin_data=Read8Bit(); //循环从8025中读数据,存入pdin_data所指的存储器中
Ack(); //IIC应答
pdin_data++; //指向存储读入数据的存储器指针加1
nbyte--; //剩余要读入的字节减1
};
*pdin_data=Read8Bit(); //读入最后一个字节
NoAck(); //IIC无应答操作
Stop();
DelayMs(1);
return 0;
}
/*****************************************************************************
从8025读多个字节
pdin_data:指向要保存读出数据的数组的指针
adr:8025中要读出数据的首地址
nbyte:读出的字节数
返回值: 0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Read8025_3(unsigned char *pdin_data)
{unsigned char nbyte,*addr;
nbyte = 15;
// Start(); //启动IIC总线
// Write8Bit(W_DEVICE_ADR); //写8025的芯片地址以及确定下面执行写操作
// if(TestAck()==1)
// return 1;
// Write8Bit(adr); //写8025操作的地址
// if(TestAck()==1)
// return 1;
Start(); //再次启动IIC总线
Write8Bit(R_DEVICE_ADR); //写8025的芯片地址以及确定下面执行读操作
if(TestAck()==1)
return 1;
*(pdin_data+15) = Read8Bit(); //循环从8025中读数据,存入pdin_data所指的存储器中
Ack(); //IIC应答
while(nbyte!=1)
{
*pdin_data=Read8Bit(); //循环从8025中读数据,存入pdin_data所指的存储器中
Ack(); //IIC应答
pdin_data++; //指向存储读入数据的存储器指针加1
nbyte--; //剩余要读入的字节减1
};
*pdin_data = Read8Bit(); //读入最后一个字节
NoAck(); //IIC无应答操作
Stop();
DelayMs(1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -