问题解决了!
在AD7705 Dout端接个22pf的电容终于OK
我也不知道为什么,就行了
OK~(≧▽≦)/~啦啦啦
情况是这样的!此程序在51上模拟spi是可以的!移植过来时在第一块AD7705上测试是通过的!但后来烧了这块AD7705后!重新上一块AD7705后就读数出问题了!新的AD7705在51上测试是没问题的!
真的是不知道哪里出问题了!读出的数据论七八糟的!
都搞了了几天了!快疯了…………
真心求助!懂的伸个援助之手!小弟不胜感激…………
#include "spi.h"
/* 复用功能 SPI1_REMAP = 0
SPI1_NSS PA4 CS
SPI1_SCK PA5 CLK
SPI1_MISO PA6 DOUT
SPI1_MOSI PA7 DIN
PA8 DRDY */
#define CS_ADC_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_4) /*片选*/
#define CS_ADC_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_4)
SPI_InitTypeDef SPI_InitStructure;
void SPIx_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;// AdDrdy
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;//PC8配置成上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4;//SPI CS DAC8554 AD7705
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SPI_Cmd(SPI1, DISABLE); //失能能SPI外设
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态:时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
CS_ADC_LOW();
SPIx_ReadWriteByte(0xff);//启动传输
CS_ADC_HIGH();
}
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPIx_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}
//写数据
void AD7705_WriteByte(u8 Dst_Addr)
{
CS_ADC_LOW();//使能器件
delay_us(20);
SPIx_ReadWriteByte(Dst_Addr);
delay_us(100);
CS_ADC_HIGH();//使能器件
}
/********AD7705初始化函数***********/
void Init_AD7705(u8 chnanel)
{
u8 i;
for(i=0;i<100;i++)/* 多于连续32个 DIN=1 使串口复位 */
{
AD7705_WriteByte(0xff);//持续DIN高电平写操作,恢复AD7705接口
}
delay_ms(1);
switch(chnanel)
{
case 1:
AD7705_WriteByte(0x20); /* 写通讯寄存器选中ch1*/
AD7705_WriteByte(0x04); /* 1MHz时钟,200Hz数据更新速率 */
AD7705_WriteByte(0x10); /*选择设置寄存器,使用chnanel 1*/
AD7705_WriteByte(0x44); //写设置寄存器 ,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
break;
case 2:
AD7705_WriteByte(0x21); /* 写通讯寄存器选中ch2 */
AD7705_WriteByte(0x04); /* 1MHz时钟,200Hz数据更新速率 */
AD7705_WriteByte(0x11); /*选择设置寄存器,使用chnane 2*/
AD7705_WriteByte(0x44); //写设置寄存器,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
break;
default:
break;
}
}
/* 读AD7705转换数据 输入通道channel */
u16 GetData7705_CH1(void)
{
u16 temp1 = 0;
u16 DataL = 0;
u16 DataH = 0;
Init_AD7705(1); //初始化通道1
delay_ms(1);
AD7705_WriteByte(0x38); //选中CH1数据寄存器读
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==1); //待数据准备好AdDrdy=0
CS_ADC_LOW(); //使能器件
delay_us(20);
DataH = SPIx_ReadWriteByte(0xff);
DataL = SPIx_ReadWriteByte(0xff);
delay_us(200);
CS_ADC_HIGH(); //取消片选
DataH = DataH << 8;
temp1 = DataH | DataL;
return temp1;
}
/* 读AD7705转换数据 输入通道channel */
u16 GetData7705_CH2(void)
{
u16 temp2 = 0;
u16 DataL = 0;
u16 DataH = 0;
Init_AD7705(2); //初始化通道2
delay_ms(1);
AD7705_WriteByte(0x39); //选中CH2数据寄存器读
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==1); //待数据准备好AdDrdy=0
CS_ADC_LOW(); //使能器件
delay_us(20);
DataH = SPIx_ReadWriteByte(0xff);
DataL = SPIx_ReadWriteByte(0xff);
delay_us(100);
CS_ADC_HIGH(); //取消片选
DataH = DataH << 8;
temp2 = DataH | DataL;
return temp2;
}
//数据处理
void ADC_7705(void)
{
u8 num1[]={"0000.0mV"};
u8 num2[]={"0000.0mV"};
u16 RCH1_16bit,RCH2_16bit;
u32 l_ncm1,l_ncm2;
RCH1_16bit = GetData7705_CH1();
l_ncm1 = (u32)(RCH1_16bit*(2500.0/65535)); //算出通道1电压
RCH2_16bit = GetData7705_CH2();
l_ncm2 = (u32)(RCH2_16bit*(2500.0/65535)); //算出通道2电压
num1[0] = l_ncm1/10000+'0';
num1[1] = (l_ncm1%10000)/1000+'0';
num1[2] = (l_ncm1%1000)/100+'0';
num1[3] = (l_ncm1%100)/10+'0';
num1[5] = l_ncm1%10+'0';
num2[0] = l_ncm2/10000+'0';
num2[1] = (l_ncm2%10000)/1000+'0';
num2[2] = (l_ncm2%1000)/100+'0';
num2[3] = (l_ncm2%100)/10+'0';
num2[5] = l_ncm2%10+'0';
LCD_ShowString(140,40,num1);
LCD_ShowString(140,60,num2);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
与STM32的硬件SPI相连,用做电平转换吗?
一周热门 更多>