AD7705如何与单片机之间的双向通信通信

21ic官方微信-->
ad7705单片读数据求助
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
我写的程序也是参考网上前辈的人,可AD7705_DRDY为什么一直处于高电平,希望懂得帮我说一下,谢谢。
#include&reg52.h&
#include&intrins.h&
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_e=P2^7;
sbit led=P0^7;
sbit led1=P0^5;
sbit AD7705_CLK=P1^0;
sbit AD7705_CS=P2^1;
sbit AD7705_DRDY=P1^3;
sbit AD7705_DATA=P1^2;
sbit AD7705_DATAin=P1^1;
//sbit AD7705_DATA1=P2^0;
#define lcd_db P0
#define uchar unsigned char
#define uint unsigned int
unsigned int MSB_Data,LSB_Data,temp0,temp1,temp2,temp3,temp4,temp5;
uchar str1[]={&wellcome to&};
uchar str2[]={'0','1','2','3','4','5','6','7','8','9'};
void AD7705_Read();
void AD7705_init();
void delay(ms)
while(ms--)
{for(i=0;i&250;i++)
{_nop_();_nop_();_nop_();_nop_();}
void write_cmd(cmd)//写入指令
uchar lcd_buzy()//查看是否在忙
void write_dat(uchar str)//写数据
while(lcd_buzy()&0x80);
void write_cusor(uchar addr)//写坐标的位置
write_cmd(addr|0x80);
void write_lcd(uchar *str)//写显示
while(*str!='\0')
&&write_dat(*str++);
void lcd_init()//LCD初始化
&&write_cmd(0x38);
&&write_cmd(0x0c);
&&write_cmd(0x06);
&&write_cmd(0x01);
&&lcd_init();
&&AD7705_DRDY=1;
&&AD7705_DATAin=1;
&&AD7705_init();
&&AD7705_CS=0;
&&while(lcd_buzy()&0x80);
&&write_cusor(0);
&&write_lcd(str1);
&&write_cusor(0x40);
&&//write_lcd(str2);
&&delay(10);
&&while(1)
& & led1=0;
& & & & while(AD7705_DRDY==1);
& & & & led1=1;
& & & & AD7705_Read();
& & write_cusor(0x40);
& & & & //write_dat(str2[1]);
& & & & write_dat(str2[temp2]);
& & & & write_cusor(0x41);
& & & & write_dat(str2[temp3]);
& & & & write_cusor(0x42);
& & & & write_dat(str2[temp4]);
& & & & write_cusor(0x43);
& & & & write_dat(str2[temp5]);
& & & & //while(!AD7705_DRDY);
/////////////////////////ad7705///////读取处理部分
void AD7705_Write_Reg(unsigned char Data_byte)//写寄存器
AD7705_CS = 0;
AD7705_CLK = 1;
&&_nop_();
&&_nop_();
for(i = 0; i & 8; i++)
&&AD7705_CLK = 0;
&&_nop_();
&&_nop_();
&&_nop_();
&&AD7705_DATAin = (bit)(Data_byte & 0x80);
& &_nop_();
&&_nop_();
&&_nop_();
&&AD7705_CLK = 1;
&&Data_byte &&= 1;
&&_nop_();
&&AD7705_DATA =1;
&&AD7705_CS = 0;
unsigned char AD7705_Read_Reg()//读寄储器
unsigned char i,Data_
AD7705_CS = 0;
AD7705_CLK = 1;
& &&&_nop_();
for(i = 0; i & 16; i++)
& &&&AD7705_CLK = 0;
& && &&&_nop_();
& &&&_nop_();
&&Data_read &&= 1;
&&if(AD7705_DATA)
&&Data_read=Data_read+1;
&&_nop_();
&&_nop_();
& && &&&AD7705_CLK = 1;
& && &&&_nop_();
& &&&_nop_();
& &_nop_();
&&AD7705_CS = 0;
&&//AD7705_DRDY = 1;
&&return(Data_read);
void AD7705_Reset(void)//复位
AD7705_CLK=1;
AD7705_DATAin=1;& & // DIN端口连续写40个周期的高电平,保证复位
for(i=0;i&40;i++)
& & AD7705_CLK=0;
& & & & _nop_();
& & AD7705_CLK=1;
& & & & _nop_();
&&delay(10);& && && && & // 复位之后等待1MS& && && &
void AD7705_init()
AD7705_Reset();
AD7705_Write_Reg(0x20);//通道1 ,下一个写时钟寄存器
AD7705_Write_Reg(0x0c);//写时钟寄存器设置更新速率为20Hz
AD7705_Write_Reg(0x10);//通道1 ,下一个写设置寄存器
AD7705_Write_Reg(0x44);//写设置寄存器,设置成双极性、无缓冲、增益为1、滤波器工作、自校准
void AD7705_Read()
&&//while(AD7705_DRDY);// 写数据的时候不需要判断忙,只有读数据的时候才需要
&&AD7705_Write_Reg(0x38);//读第一个通道
MSB_Data = AD7705_Read_Reg();
//MSB_Data =45;
LSB_Data = AD7705_Read_Reg();
//LSB_Data =12;
T_Voltage =(float)MSB_D
T_Voltage = T_Voltage*100;
T_Voltage = T_Voltage + (float)LSB_D
temp0 = T_Voltage/100000;
temp1 = ((T_Voltage-temp0*000);
temp2 = ((T_Voltage-temp0*100000-temp1*1);
temp3 = ((T_Voltage-temp0*100000-temp1*10000-temp2*);
temp4 = (T_Voltage-temp0*100000-temp1*10000-temp2*1000-temp3*100)/10;
temp5 = (T_Voltage-temp0*100000-temp1*10000-temp2*1000-temp3*100-temp4*10);
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
时钟正常了没有?初始化正常了没有?
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
谢谢您的回答,时钟正常是用4。95哪种时钟,标准的。现在就是数据读出来乱七八糟的。
liwanxi 发表于
谢谢您的回答,时钟正常是用4。95哪种时钟,标准的。现在就是数据读出来乱七八糟的。 ...
先确认一下硬件有没有问题
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
谢谢您的回答,硬件没在问题.
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
用单片机和模块的。
助理工程师, 积分 1207, 距离下一级还需 793 积分
助理工程师, 积分 1207, 距离下一级还需 793 积分
助理工程师, 积分 1207, 距离下一级还需 793 积分
助理工程师, 积分 1207, 距离下一级还需 793 积分
这个芯片很早用过,现在多忘了
扫描二维码,随时随地手机跟帖
精英会员奖章
等级类勋章
奔腾之江水
发帖类勋章
技术领袖奖章
人才类勋章
时间类勋章
坚毅之洋流
发帖类勋章
时间类勋章
核心会员奖章
等级类勋章
技术高手奖章
人才类勋章
时间类勋章
涓涓之细流
发帖类勋章
希望之星奖章
等级类勋章
您需要登录后才可以回帖
热门推荐 /5还没有帐号? 赶紧
用户版块帖子
求助关AD7705双通道读取问题
UID:1129047
在线时间343小时
M币27专家1
&&发表于: 06-10
STC15F2K60S2、晶振11.0592、AD7705晶振2.4576、基准2.485V、串口波特率9600AIN1和AIN2并联同时接输入信号67mV左右下面是串口接收到的不同增益时读到的数据CH1: 1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&CH2: 16CH1=28047 ( 2139mV) CH2=28352 ( 2163mV)CH1=28047 ( 2139mV) CH2=28352 ( 2163mV)CH1=28047 ( 2139mV) CH2=28352 ( 2163mV)CH1=28046 ( 2139mV) CH2=28352 ( 2163mV)CH1=28046 ( 2139mV) CH2=28351 ( 2163mV)CH1=28046 ( 2139mV) CH2=28352 ( 2163mV) CH1: 16&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&CH2: 1CH1= 2035 (&&155mV) CH2= 1772 (&&135mV)CH1= 2035 (&&155mV) CH2= 1772 (&&135mV)CH1= 2035 (&&155mV) CH2= 1772 (&&135mV)CH1= 2035 (&&155mV) CH2= 1772 (&&135mV)CH1= 2035 (&&155mV) CH2= 1772 (&&135mV)CH1= 2035 (&&155mV) CH2= 1772 (&&135mV) CH1: 1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&CH2: 1CH1= 1772 (&&135mV) CH2= 1772 (&&135mV)CH1= 1773 (&&135mV) CH2= 1772 (&&135mV)CH1= 1773 (&&135mV) CH2= 1772 (&&135mV)CH1= 1772 (&&135mV) CH2= 1772 (&&135mV)CH1= 1773 (&&135mV) CH2= 1772 (&&135mV)CH1= 1773 (&&135mV) CH2= 1772 (&&135mV) CH1: 16&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&CH2: 16CH1=28354 ( 2163mV) CH2=28352 ( 2163mV)CH1=28355 ( 2163mV) CH2=28351 ( 2163mV)CH1=28355 ( 2163mV) CH2=28352 ( 2163mV)CH1=28355 ( 2163mV) CH2=28351 ( 2163mV)CH1=28355 ( 2163mV) CH2=28351 ( 2163mV)CH1=28355 ( 2163mV) CH2=28352 ( 2163mV) 两个通道设不同增益时读到的数据不对程序是网上找到的按电路改了一下请各位帮忙看一下哪里不对。 以下是部分代码 uint16_t adc1, adc2;&&&&&&&&bsp_InitTM7705();&&&&&&&&&&&&/* 初始化配置TM7705 */&&&&TM7705_CalibSelf(1);&&&&&&&&/* 自校准。执行时间较长,约180ms */&&&&&&&&&&&&adc1 = TM7705_ReadAdc(1);&&&&&&&&&&&&&&&&&&&&&&&&TM7705_CalibSelf(2);&&&&&&&&/* 自校准。执行时间较长,约180ms */&&&&adc2 = TM7705_ReadAdc(2);&&&&&&&&&&&&while (1)&&&&{&&&&&&&&&&&&bsp_Idle();&&&&&&&&&&&&&&&&#if 1&&&&&&&&&&&&&&&&/* 双通道切换采样,执行一轮实际那约 160ms */&&&&&&&&&&&&&&&&&&&&&&&&adc1 = TM7705_ReadAdc(1);&&&&/* 执行时间 80ms */&&&&&&&&&&&&&&&&&&&&adc2 = TM7705_ReadAdc(2);&&&&/* 执行时间 80ms */&&&&&&&&#else&&&&&&&&&&&&/* 如果只采集1个通道,则刷新速率 50Hz (缺省设置的,最大可以设置为500Hz) */&&&&&&&&&&&&adc1 = TM7705_ReadAdc(1);&&&&/* 执行时间 20ms (50Hz速率刷新时) */&&&&&&&&&&&&&&&&&&&&adc2 = 0;&&&&&&&&#endif&&&&&&&&&&&&&&&&&&&&/* 打印采集数据 */&&&&&&&&{&&&&&&&&&&&&int volt1, volt2;&&&&&&&&&&&&&&&&&&&&&&&&/* 计算实际电压值(近似估算的),如需准确,请进行校准 */&&&&&&&&&&&&volt1 = ((int32_t)adc1 * 5000) / 65535;&&&&&&&&&&&&volt2 = ((int32_t)adc2 * 5000) / 65535;&&&&&&&&&&&&&&&&&&&&&&&&/* 打印ADC采样结果 */&&&&&&&&&&&&&&&&printf(&CH1=%5ld (%5dmV) CH2=%5ld (%5dmV)\r\n&, (long int)adc1, volt1, (long int)adc2, volt2);&&&&&&&&}&&&&}/************************************************************************************************************&&&&模块名称 : TM7705 驱动模块(2通道带PGA的16位ADC)*&&&&文件名称 : bsp_tm7705.c*&&&&版&&&&本 : V1.0*&&&&说&&&&明 : TM7705模块和CPU之间采用SPI接口。本驱动程序支持软件SPI接口。**&&&&修改记录 :*&&&&&&&&版本号&&日期&&&&&&&&作者&&&& 说明*&&&&&&&&V1.0&&&&&&armfly&&正式发布**&&&&Copyright (C), , 安富莱电子 www.armfly.com***********************************************************************************************************/#include &bsp.h&#define SOFT_SPI&&&&&&&&/* 定义此行表示使用GPIO模拟SPI接口 *///#define HARD_SPI&&&&&&&&/* 定义此行表示使用CPU的硬件SPI接口 *//* 通道1和通道2的增益,输入缓冲,极性 */#define __CH1_GAIN_BIPOLAR_BUF&&&&(GAIN_1 | UNIPOLAR | BUF_EN)#define __CH2_GAIN_BIPOLAR_BUF&&&&(GAIN_16 | UNIPOLAR | BUF_EN)/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&接线方法: STC89C52开发板,请使用杜邦线连接。&&&&TM7705模块&& STC89C52开发板&&&&&&VCC&& ------&&5.0V (3.3V)&&&&&&GND&& ------&&GND&&&&&&CS&&&&------&&P1.0&&&&&&RST&& ------&&P1.1&& &&&&&&DIN&& ------&&P1.2&&&&&&SCK&& ------&&P1.3&&&&&&DOUT&&------&&P1.4&&&&&&DRDY&&------&&P1.5&&&&&&&&*/#if !defined(SOFT_SPI) && !defined(HARD_SPI)&&&& #error &Please define SPI Interface mode : SOFT_SPI or HARD_SPI&#endif#ifdef SOFT_SPI&&&&&&&&/* 软件SPI */&&&&/* 定义GPIO端口 */&&&&sbit CS&&&& = P1^0;&&&&sbit RESET&&= P1^1;&&&&sbit DIN&&&&= P3^7;&&&&sbit SCK&&&&= P4^1;&&&&sbit DOUT&& = P3^6;&&&&sbit DRDY&&&&= P3^5;&&&&/* 定义口线置0和置1的宏 */&&&&#define CS_0()&&&&&&&&CS = 0&&&&#define CS_1()&&&&&&&&CS = 1&&&&#define RESET_0()&&&&RESET = 0&&&&#define RESET_1()&&&&RESET = 1&&&&#define DI_0()&&&&&&&&DIN = 0&&&&#define DI_1()&&&&&&&&DIN = 1&&&&#define SCK_0()&&&&&&&&SCK = 0 &&&&#define SCK_1()&&&&&&&&SCK = 1&&&&#define DO_IS_HIGH()&&&&(DOUT != 0)&&&&#define DRDY_IS_LOW()&&&&(DRDY == 0)#endif#ifdef HARD_SPI&&&&&&&&/* 硬件SPI */&&&&#error &Don't surport Hard SPI Interface mode&#endif/* 通信寄存器bit定义 */enum{&&&&/* 寄存器选择&&RS2 RS1 RS0&&*/&&&&REG_COMM&&&&= 0x00,&&&&/* 通信寄存器 */&&&&REG_SETUP&&&&= 0x10,&&&&/* 设置寄存器 */&&&&REG_CLOCK&&&&= 0x20,&&&&/* 时钟寄存器 */&&&&REG_DATA&&&&= 0x30,&&&&/* 数据寄存器 */&&&&REG_ZERO_CH1&&&&= 0x60,&&&&/* CH1 偏移寄存器 */&&&&REG_FULL_CH1&&&&= 0x70,&&&&/* CH1 满量程寄存器 */&&&&REG_ZERO_CH2&&&&= 0x61,&&&&/* CH2 偏移寄存器 */&&&&REG_FULL_CH2&&&&= 0x71,&&&&/* CH2 满量程寄存器 */&&&&/* 读写操作 */&&&&WRITE&&&&&&&& = 0x00,&&&&/* 写操作 */&&&&READ&&&&&&&& = 0x08,&&&&/* 读操作 */&&&&/* 通道 */&&&&CH_1&&&&&&&&= 0,&&&&/* AIN1+&&AIN1- */&&&&CH_2&&&&&&&&= 1,&&&&/* AIN2+&&AIN2- */&&&&CH_3&&&&&&&&= 2,&&&&/* AIN1-&&AIN1- */&&&&CH_4&&&&&&&&= 3&&&&&&&&/* AIN1-&&AIN2- */};/* 设置寄存器bit定义 */enum{&&&&MD_NORMAL&&&&&&&&= (0 && 6),&&&&/* 正常模式 */&&&&MD_CAL_SELF&&&&&&&&= (1 && 6),&&&&/* 自校准模式 */&&&&MD_CAL_ZERO&&&&&&&&= (2 && 6),&&&&/* 校准0刻度模式 */&&&&MD_CAL_FULL&&&&&&&&= (3 && 6),&&&&/* 校准满刻度模式 */&&&&GAIN_1&&&&&&&&&&&&= (0 && 3),&&&&/* 增益 */&&&&GAIN_2&&&&&&&&&&&&= (1 && 3),&&&&/* 增益 */&&&&GAIN_4&&&&&&&&&&&&= (2 && 3),&&&&/* 增益 */&&&&GAIN_8&&&&&&&&&&&&= (3 && 3),&&&&/* 增益 */&&&&GAIN_16&&&&&&&&&&&&= (4 && 3),&&&&/* 增益 */&&&&GAIN_32&&&&&&&&&&&&= (5 && 3),&&&&/* 增益 */&&&&GAIN_64&&&&&&&&&&&&= (6 && 3),&&&&/* 增益 */&&&&GAIN_128&&&&&&&&= (7 && 3),&&&&/* 增益 */&&&&/* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */&&&&BIPOLAR&&&&&&&&&&&&= (0 && 2),&&&&/* 双极性输入 */&&&&UNIPOLAR&&&&&&&&= (1 && 2),&&&&/* 单极性输入 */&&&&BUF_NO&&&&&&&&&&&&= (0 && 1),&&&&/* 输入无缓冲(内部缓冲器不启用) */&&&&BUF_EN&&&&&&&&&&&&= (1 && 1),&&&&/* 输入有缓冲 (启用内部缓冲器) */&&&&FSYNC_0&&&&&&&&&&&&= 0,&&&&FSYNC_1&&&&&&&&&&&&= 1&&&&&&&&/* 不启用 */};/* 时钟寄存器bit定义 */enum{&&&&CLKDIS_0&&&&= 0x00,&&&&&&&&/* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */&&&&CLKDIS_1&&&&= 0x10,&&&&&&&&/* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */&&&&/*&&&&&&&&2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “0”。&&&&&&&&1MHz (CLKDIV=0 )或 2MHz&& (CLKDIV=1 ),CLK 该位应置&&“1”&&&&*/&&&&CLK_4_9152M = 0x08,&&&&CLK_2_4576M = 0x00,&&&&CLK_1M&&&&&&&& = 0x04,&&&&CLK_2M&&&&&&&& = 0x0C,&&&&FS_50HZ&&&&&&&&= 0x00,&&&&FS_60HZ&&&&&&&&= 0x01,&&&&FS_250HZ&&&&= 0x02,&&&&FS_500HZ&&&&= 0x04,&&&&/*&&&&&&&&四十九、电子秤应用中提高TM7705 精度的方法&&&&&&&&&&&&当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。&&&&&&&&&&&&当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据&&&&*/&&&&ZERO_0&&&&&&&&= 0x00,&&&&ZERO_1&&&&&&&&= 0x80};static void TM7705_SyncSPI(void);static void TM7705_Send8Bit(uint8_t _data);static uint8_t TM7705_Recive8Bit(void);static void TM7705_WriteByte(uint8_t _data);static void TM7705_Write3Byte(uint32_t _data);static uint8_t TM7705_ReadByte(void);static uint16_t TM7705_Read2Byte(void);static uint32_t TM7705_Read3Byte(void);static void TM7705_WaitDRDY(void);static void TM7705_ResetHard(void);static void TM7705_Delay(void);/***********************************************************************************************************&&&&函 数 名: bsp_InitTM7705*&&&&功能说明: 配置STM32的GPIO和SPI接口,用于连接 TM7705*&&&&形&&&&参: 无*&&&&返 回 值: 无**********************************************************************************************************/void bsp_InitTM7705(void){#ifdef SOFT_SPI&&&&&&&&/* 软件SPI */&&&&/* 配置REST口线为推挽输出,缺省输出高电平 */&&&&/* 配置CS口线为推挽输出,缺省输出高电平 */&&&&/* 配置SCK口线为推挽输出,缺省输出高电平 */&&&&/* 配置DIN口线为推挽输出,缺省输出高电平 */&&&&/* 配置DOUT口线为输入浮空模式 */&&&&/* 配置DOUT口线为输入上拉模式 */#endif&&&&bsp_DelayMS(10);&&&&TM7705_ResetHard();&&&&&&&&/* 硬件复位 */&&&&/*&&&&&&&&在接口序列丢失的情况下,如果在DIN 高电平的写操作持续了足够长的时间(至少 32个串行时钟周期),&&&&&&&&TM7705 将会回到默认状态。&&&&*/&&&&bsp_DelayMS(5);&&&&TM7705_SyncSPI();&&&&&&&&/* 同步SPI接口时序 */&&&&bsp_DelayMS(5);&&&&/* 配置时钟寄存器 */&&&&TM7705_WriteByte(REG_CLOCK | WRITE | CH_1);&&&&&&&&&&&&/* 先写通信寄存器,下一步是写时钟寄存器 */&&&&TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_50HZ);&&&&/* 刷新速率50Hz */&&&&//TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_500HZ);&&&&/* 刷新速率500Hz */&&&&/* 每次上电进行一次自校准 */&&&&TM7705_CalibSelf(1);&&&&/* 内部自校准 CH1 */&&&&bsp_DelayMS(5);&&&&/* 配置时钟寄存器 */&&&&TM7705_WriteByte(REG_CLOCK | WRITE | CH_2);&&&&&&&&&&&&/* 先写通信寄存器,下一步是写时钟寄存器 */&&&&TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_50HZ);&&&&/* 刷新速率50Hz */&&&&//TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_500HZ);&&&&/* 刷新速率500Hz */&&&&/* 每次上电进行一次自校准 */&&&&TM7705_CalibSelf(2);&&&&/* 内部自校准 CH1 */&&&&bsp_DelayMS(5);}/***********************************************************************************************************&&&&函 数 名: TM7705_Delay*&&&&功能说明: CLK之间的延迟,时序延迟. 对于51,可以不延迟*&&&&形&&&&参: 无*&&&&返 回 值: 无**********************************************************************************************************/static void TM7705_Delay(void){&&&&uint16_&&&&for (i = 0; i & 50; i++);}/***********************************************************************************************************&&&&函 数 名: TM7705_ResetHard*&&&&功能说明: 硬件复位 TM7705芯片*&&&&形&&&&参: 无*&&&&返 回 值: 无**********************************************************************************************************/static void TM7705_ResetHard(void){&&&&RESET_1();&&&&bsp_DelayMS(1);&&&&RESET_0();&&&&bsp_DelayMS(2);&&&&RESET_1();&&&&bsp_DelayMS(1);}/***********************************************************************************************************&&&&函 数 名: TM7705_SyncSPI*&&&&功能说明: 同步TM7705芯片SPI接口时序*&&&&形&&&&参: 无*&&&&返 回 值: 无**********************************************************************************************************/static void TM7705_SyncSPI(void){&&&&/* AD7705串行接口失步后将其复位。复位后要延时500us再访问 */&&&&CS_0();&&&&TM7705_Send8Bit(0xFF);&&&&TM7705_Send8Bit(0xFF);&&&&TM7705_Send8Bit(0xFF);&&&&TM7705_Send8Bit(0xFF);&&&&CS_1();}/***********************************************************************************************************&&&&函 数 名: TM7705_Send8Bit*&&&&功能说明: 向SPI总线发送8个bit数据。 不带CS控制。*&&&&形&&&&参: _data : 数据*&&&&返 回 值: 无**********************************************************************************************************/static void TM7705_Send8Bit(uint8_t _data){&&&&uint8_&&&&for(i = 0; i & 8; i++)&&&&{&&&&&&&&if (_data & 0x80)&&&&&&&&{&&&&&&&&&&&&DI_1();&&&&&&&&}&&&&&&&&else&&&&&&&&{&&&&&&&&&&&&DI_0();&&&&&&&&}&&&&&&&&SCK_0();&&&&&&&&_data &&= 1;&&&&&&&&TM7705_Delay();&&&&&&&&SCK_1();&&&&&&&&TM7705_Delay();&&&&}}/***********************************************************************************************************&&&&函 数 名: TM7705_Recive8Bit*&&&&功能说明: 从SPI总线接收8个bit数据。 不带CS控制。*&&&&形&&&&参: 无*&&&&返 回 值: 无**********************************************************************************************************/static uint8_t TM7705_Recive8Bit(void){&&&&uint8_&&&&uint8_t read = 0;&&&&for (i = 0; i & 8; i++)&&&&{&&&&&&&&SCK_0();&&&&&&&&TM7705_Delay();&&&&&&&&read = read&&1;&&&&&&&&if (DO_IS_HIGH())&&&&&&&&{&&&&&&&&&&&&read++;&&&&&&&&}&&&&&&&&SCK_1();&&&&&&&&TM7705_Delay();&&&&}&&&&}/***********************************************************************************************************&&&&函 数 名: TM7705_WriteByte*&&&&功能说明: 写入1个字节。带CS控制*&&&&形&&&&参: _data :将要写入的数据*&&&&返 回 值: 无**********************************************************************************************************/static void TM7705_WriteByte(uint8_t _data){&&&&CS_0();&&&&TM7705_Send8Bit(_data);&&&&CS_1();}/***********************************************************************************************************&&&&函 数 名: TM7705_Write3Byte*&&&&功能说明: 写入3个字节。带CS控制*&&&&形&&&&参: _data :将要写入的数据*&&&&返 回 值: 无**********************************************************************************************************/static void TM7705_Write3Byte(uint32_t _data){&&&&CS_0();&&&&TM7705_Send8Bit((_data && 16) & 0xFF);&&&&TM7705_Send8Bit((_data && 8) & 0xFF);&&&&TM7705_Send8Bit(_data);&&&&CS_1();}/***********************************************************************************************************&&&&函 数 名: TM7705_ReadByte*&&&&功能说明: 从AD芯片读取一个字(16位)*&&&&形&&&&参: 无*&&&&返 回 值: 读取的字(16位)**********************************************************************************************************/static uint8_t TM7705_ReadByte(void){&&&&uint8_&&&&CS_0();&&&&read = TM7705_Recive8Bit();&&&&CS_1();&&&&}/***********************************************************************************************************&&&&函 数 名: TM7705_Read2Byte*&&&&功能说明: 读2字节数据*&&&&形&&&&参: 无*&&&&返 回 值: 读取的数据(16位)**********************************************************************************************************/static uint16_t TM7705_Read2Byte(void){&&&&uint16_&&&&CS_0();&&&&read = TM7705_Recive8Bit();&&&&read &&= 8;&&&&read += TM7705_Recive8Bit();&&&&CS_1();&&&&}/***********************************************************************************************************&&&&函 数 名: TM7705_Read3Byte*&&&&功能说明: 读3字节数据*&&&&形&&&&参: 无*&&&&返 回 值: 读取到的数据(24bit) 高8位固定为0.**********************************************************************************************************/static uint32_t TM7705_Read3Byte(void){&&&&uint32_&&&&CS_0();&&&&read = TM7705_Recive8Bit();&&&&read &&= 8;&&&&read += TM7705_Recive8Bit();&&&&read &&= 8;&&&&read += TM7705_Recive8Bit();&&&&CS_1();&&&&}/***********************************************************************************************************&&&&函 数 名: TM7705_WaitDRDY*&&&&功能说明: 等待内部操作完成。 自校准时间较长,需要等待。*&&&&形&&&&参: 无*&&&&返 回 值: 无**********************************************************************************************************/static void TM7705_WaitDRDY(void){&&&&uint32_&&&&for (i = 0; i & 8000; i++)&&&&{&&&&&&&&if (DRDY_IS_LOW())&&&&&&&&{&&&&&&&&&&&&&&&&&&&&}&&&&}&&&&if (i &= 8000)&&&&{&&&&&&&&printf(&TM7705_WaitDRDY() 芯片应答超时 ...\r\n&);&&&&&&&&/* 调试语句. 用语排错 */&&&&&&&&printf(&重新同步SPI接口时序\r\n&);&&&&&&&&/* 调试语句. 用语排错 */&&&&&&&&TM7705_SyncSPI();&&&&&&&&/* 同步SPI接口时序 */&&&&&&&&bsp_DelayMS(5);&&&&}}/***********************************************************************************************************&&&&函 数 名: TM7705_WriteReg*&&&&功能说明: 写指定的寄存器*&&&&形&&&&参:&&_RegID : 寄存器ID*&&&&&&&&&&&&&&_RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit*&&&&返 回 值: 无**********************************************************************************************************/void TM7705_WriteReg(uint8_t _RegID, uint32_t _RegValue){&&&&uint8_&&&&switch (_RegID)&&&&{&&&&&&&&case REG_COMM:&&&&&&&&/* 通信寄存器 */&&&&&&&&case REG_SETUP:&&&&&&&&/* 设置寄存器 8bit */&&&&&&&&case REG_CLOCK:&&&&&&&&/* 时钟寄存器 8bit */&&&&&&&&&&&&bits = 8;&&&&&&&&&&&&&&&&&&&&case REG_ZERO_CH1:&&&&/* CH1 偏移寄存器 24bit */&&&&&&&&case REG_FULL_CH1:&&&&/* CH1 满量程寄存器 24bit */&&&&&&&&case REG_ZERO_CH2:&&&&/* CH2 偏移寄存器 24bit */&&&&&&&&case REG_FULL_CH2:&&&&/* CH2 满量程寄存器 24bit*/&&&&&&&&&&&&bits = 24;&&&&&&&&&&&&&&&&&&&&case REG_DATA:&&&&&&&&/* 数据寄存器 16bit */&&&&&&&&default:&&&&&&&&&&&&&&&&}&&&&TM7705_WriteByte(_RegID | WRITE);&&&&/* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */&&&&if (bits == 8)&&&&{&&&&&&&&TM7705_WriteByte((uint8_t)_RegValue);&&&&}&&&&else&&&&/* 24bit */&&&&{&&&&&&&&TM7705_Write3Byte(_RegValue);&&&&}}/***********************************************************************************************************&&&&函 数 名: TM7705_ReadReg*&&&&功能说明: 写指定的寄存器*&&&&形&&&&参:&&_RegID : 寄存器ID*&&&&&&&&&&&&&&_RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit*&&&&返 回 值: 读到的寄存器值。 对于8位的寄存器,取32位形参的低8bit**********************************************************************************************************/uint32_t TM7705_ReadReg(uint8_t _RegID){&&&&uint8_&&&&uint32_&&&&switch (_RegID)&&&&{&&&&&&&&case REG_COMM:&&&&&&&&/* 通信寄存器 */&&&&&&&&case REG_SETUP:&&&&&&&&/* 设置寄存器 8bit */&&&&&&&&case REG_CLOCK:&&&&&&&&/* 时钟寄存器 8bit */&&&&&&&&&&&&bits = 8;&&&&&&&&&&&&&&&&&&&&case REG_ZERO_CH1:&&&&/* CH1 偏移寄存器 24bit */&&&&&&&&case REG_FULL_CH1:&&&&/* CH1 满量程寄存器 24bit */&&&&&&&&case REG_ZERO_CH2:&&&&/* CH2 偏移寄存器 24bit */&&&&&&&&case REG_FULL_CH2:&&&&/* CH2 满量程寄存器 24bit*/&&&&&&&&&&&&bits = 24;&&&&&&&&&&&&&&&&&&&&case REG_DATA:&&&&&&&&/* 数据寄存器 16bit */&&&&&&&&default:&&&&&&&&&&&&return 0xFFFFFFFF;&&&&}&&&&TM7705_WriteByte(_RegID | READ);&&&&/* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */&&&&if (bits == 16)&&&&{&&&&&&&&read = TM7705_Read2Byte();&&&&}&&&&else if (bits == 8)&&&&{&&&&&&&&read = TM7705_ReadByte();&&&&}&&&&else&&&&/* 24bit */&&&&{&&&&&&&&read = TM7705_Read3Byte();&&&&}&&&&}/***********************************************************************************************************&&&&函 数 名: TM7705_CalibSelf*&&&&功能说明: 启动自校准. 内部自动短接AIN+ AIN-校准0位,内部短接到Vref 校准满位。此函数执行过程较长,*&&&&&&&&&&&&&&实测约 180ms*&&&&形&&&&参:&&_ch : ADC通道,1或2*&&&&返 回 值: 无**********************************************************************************************************/void TM7705_CalibSelf(uint8_t _ch){&&&&if (_ch == 1)&&&&{&&&&&&&&/* 自校准CH1 */&&&&&&&&TM7705_WriteByte(REG_SETUP | WRITE | CH_1);&&&&/* 写通信寄存器,下一步是写设置寄存器,通道1 */&&&&&&&&TM7705_WriteByte(MD_CAL_SELF | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */&&&&&&&&TM7705_WaitDRDY();&&&&/* 等待内部操作完成 --- 时间较长,约180ms */&&&&}&&&&else if (_ch == 2)&&&&{&&&&&&&&/* 自校准CH2 */&&&&&&&&TM7705_WriteByte(REG_SETUP | WRITE | CH_2);&&&&/* 写通信寄存器,下一步是写设置寄存器,通道2 */&&&&&&&&TM7705_WriteByte(MD_CAL_SELF | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);&&&&/* 启动自校准 */&&&&&&&&TM7705_WaitDRDY();&&&&/* 等待内部操作完成&&--- 时间较长,约180ms */&&&&}}/***********************************************************************************************************&&&&函 数 名: TM7705_SytemCalibZero*&&&&功能说明: 启动系统校准零位. 请将AIN+ AIN-短接后,执行该函数。校准应该由主程序控制并保存校准参数。*&&&&&&&&&&&& 执行完毕后。可以通过 TM7705_ReadReg(REG_ZERO_CH1) 和&&TM7705_ReadReg(REG_ZERO_CH2) 读取校准参数。*&&&&形&&&&参: _ch : ADC通道,1或2*&&&&返 回 值: 无**********************************************************************************************************/void TM7705_SytemCalibZero(uint8_t _ch){&&&&if (_ch == 1)&&&&{&&&&&&&&/* 校准CH1 */&&&&&&&&TM7705_WriteByte(REG_SETUP | WRITE | CH_1);&&&&/* 写通信寄存器,下一步是写设置寄存器,通道1 */&&&&&&&&TM7705_WriteByte(MD_CAL_ZERO | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */&&&&&&&&TM7705_WaitDRDY();&&&&/* 等待内部操作完成 */&&&&}&&&&else if (_ch == 2)&&&&{&&&&&&&&/* 校准CH2 */&&&&&&&&TM7705_WriteByte(REG_SETUP | WRITE | CH_2);&&&&/* 写通信寄存器,下一步是写设置寄存器,通道1 */&&&&&&&&TM7705_WriteByte(MD_CAL_ZERO | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);&&&&/* 启动自校准 */&&&&&&&&TM7705_WaitDRDY();&&&&/* 等待内部操作完成 */&&&&}}/***********************************************************************************************************&&&&函 数 名: TM7705_SytemCalibFull*&&&&功能说明: 启动系统校准满位. 请将AIN+ AIN-接最大输入电压源,执行该函数。校准应该由主程序控制并保存校准参数。*&&&&&&&&&&&& 执行完毕后。可以通过 TM7705_ReadReg(REG_FULL_CH1) 和&&TM7705_ReadReg(REG_FULL_CH2) 读取校准参数。*&&&&形&&&&参:&&_ch : ADC通道,1或2*&&&&返 回 值: 无**********************************************************************************************************/void TM7705_SytemCalibFull(uint8_t _ch){&&&&if (_ch == 1)&&&&{&&&&&&&&/* 校准CH1 */&&&&&&&&TM7705_WriteByte(REG_SETUP | WRITE | CH_1);&&&&/* 写通信寄存器,下一步是写设置寄存器,通道1 */&&&&&&&&TM7705_WriteByte(MD_CAL_FULL | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */&&&&&&&&TM7705_WaitDRDY();&&&&/* 等待内部操作完成 */&&&&}&&&&else if (_ch == 2)&&&&{&&&&&&&&/* 校准CH2 */&&&&&&&&TM7705_WriteByte(REG_SETUP | WRITE | CH_2);&&&&/* 写通信寄存器,下一步是写设置寄存器,通道1 */&&&&&&&&TM7705_WriteByte(MD_CAL_FULL | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);&&&&/* 启动自校准 */&&&&&&&&TM7705_WaitDRDY();&&&&/* 等待内部操作完成 */&&&&}}/***********************************************************************************************************&&&&函 数 名: TM7705_ReadAdc1*&&&&功能说明: 读通道1或2的ADC数据*&&&&形&&&&参: 无*&&&&返 回 值: 无**********************************************************************************************************/uint16_t TM7705_ReadAdc(uint8_t _ch){&&&&uint8_&&&&uint16_t read = 0;&&&&/* 为了避免通道切换造成读数失效,读2次 */&&&&for (i = 0; i & 2; i++)&&&&{&&&&&&&&TM7705_WaitDRDY();&&&&&&&&/* 等待DRDY口线为0 */&&&&&&&&if (_ch == 1)&&&&&&&&{&&&&&&&&&&&&TM7705_WriteByte(0x38);&&&&&&&&}&&&&&&&&else if (_ch == 2)&&&&&&&&{&&&&&&&&&&&&TM7705_WriteByte(0x39);&&&&&&&&}&&&&&&&&read = TM7705_Read2Byte();&&&&}&&&&}
完整程序连接&&
[ 此帖被senzhijun在 12:27重新编辑 ]
UID:1813077
在线时间40小时
M币-493专家0
&发表于: 06-10
这里没人能回答你
UID:1073716
在线时间662小时
M币1463专家39
&发表于: 06-10
很正常,一点点差异而已
UID:1129047
在线时间343小时
M币27专家1
&发表于: 06-10
回 qd0426 的帖子
:很正常,一点点差异而已&( 12:33)&输入信号一样,通道1增益为1、通道2增益为16,相差16倍读出的数据确差不多。
UID:1731462
在线时间317小时
M币1207专家5
&发表于: 06-11
这片子时钟不能太快,快了全部是读的一个通道的数据
UID:1129047
在线时间343小时
M币27专家1
&发表于: 06-11
回 我是鑫鑫 的帖子
:这片子时钟不能太快,快了全部是读的一个通道的数据&( 19:19)&那有可能是这个问题,我再研究一下程序。
访问内容超出本站范围,不能确定是否安全
Code by , Time now is:08-25 18:13, Total 0.273875(s) query 11,
Gzip enabled&

我要回帖

更多关于 单片机双机通信 的文章

 

随机推荐