📄 max1169.c
字号:
/*------------------------------------------------------------------------------------------
[文件名] I2C.c
[版本] 1.1b
[修改自]I2C通用驱动AD7416实例程序,原作者鞠春阳
[最后修改时间] 2006年01月07日(调试完成)
[资料] 请到www.mcuzb.com下载
===========================================================================================*/
#include "reg51.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
uchar SystemError;
sbit SCL= P1^0; //定义串行时钟线所在口 使用时根据自己的需要来定义
sbit SDA= P1^1; //定义串行数据线所在口 使用时根据自己的需要来定义
SomeNOP(void)
{ //uchar ij=255;
// while(ij--){
_nop_();_nop_();_nop_();_nop_();}
//}
/*--------------------------------------------------------------------------------
调用方式:void I2CStart(void) 2005/12/10
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
//EA=0;
SDA=1; //SomeNOP();//SCL保持高,SDA从高到低一次跳变,I2C通信开始
SCL=1; SomeNOP();
SDA=0; SomeNOP();
SCL=0; SomeNOP();
}
/*--------------------------------------------------------------------------------
调用方式:void I2CStop(void) 2005/12/10
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
//SCL=0;
SDA=0; //SomeNOP(); //SCL保持高,SDA从低到高一次跳变,I2C通信停止
SCL=1; SomeNOP();
SDA=1; SomeNOP();
SCL=0; SomeNOP();
//EA=1;
}
/*--------------------------------------------------------------------------------
调用方式:I2CAck(void) 2005/12/10
函数说明:私有函数,I2C专用,等待从器件接收方的应答
ACK BY
---------------------------------------------------------------------------------*/
WaitAck(void)
{
unsigned char errtime=255;//因故障接收方无ACK(ACK对应SDA=0),超时值为255。
SDA=1;
//SDA=0;
SCL=1;
SystemError=0x10;
while(SDA)
{ errtime--;
if(!errtime)
{ I2CStop();
SystemError=0x11; //出错后给全局变量赋值
return;
}
};
SCL=0;
_nop_();
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2005/12/10
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2005/12/10
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) 2005/12/10
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(uchar ch) //write device
{
unsigned char i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //SCK下降沿发送数据
SCL=1; SomeNOP();
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) 2005/12/10
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
uchar I2CReceiveByte(void) //read device
{
unsigned char i=8,datatmp=0;
SDA=1; //释放总线
while(i--)
{
datatmp<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP(); //SCL做一次从低到高的跳变 可以接收数据
datatmp|=SDA;
};
SCL=0;
return datatmp;
}
/*--------------------------------------------------------------------------------
调用方式:uint ADC(void) 2005/12/10
函数说明:用于max1169AD转换测试(转换前是否一定要进行“HS MODE”设置?N,上电即默认为FS)
---------------------------------------------------------------------------------*/
uint ADC(uchar addr)
{
uint adc_data;
uchar nt1;
I2CStart();
nt1=(addr<<1)|0x61;
I2CSendByte(nt1); //写入器件地址,并设置器件为R模式
WaitAck(); //写入地址后,器件向主机发送ACK。
// SCL=0; //用延时的方式等待SCK变高(转换时SCK被max1169置低)
// SomeNOP();
// while(!SCL); //由于转换过程很短,转换过程中SCL保持低,转换结束后slave释放对SCL控制权,但SCL仍然为0
adc_data=I2CReceiveByte(); //read d15~d8
SendAck();
adc_data<<=8;
adc_data=adc_data|I2CReceiveByte(); //read d7~d0
SendNotAck();
I2CStop();
return(adc_data);
}
void delay(uchar x)
{ uchar j;
for(j=0;j<x;j++)
_nop_();
}
main()
{
uint ch_adc[10];
//ch1_adc=ADC(0x6); //测试max1169(地址为6)的转换
uchar n;
while(1)
{
_nop_();
for(n=0;n<10;n++)
{
ch_adc[n]=ADC(0x6);
delay(80);
}; //测试max1169(地址为6)的转换
};
/* uint ch1_adc,ch2_adc;
ch1_adc=ADC(0x6); //测试max1169(地址为6)的转换
while(1)
{
ch1_adc=ADC(0x6); //测试max1169(地址为6)的转换
};
*/
//ch2_adc=ADC(0x7); //测试max1169(地址为7)的转换
/* while(1);
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -