采集到数据一直在跳变,换算后与接入电压值也不对应,调了两天也没搞好,请大家看看,帮帮忙
*********************************************************以下是程序代码,希望各位帮忙指正
#include "spi.h"
#include "sys.h"
//PA4、PA5、PA6分别接AD7606CS、SCK/RD,DB7
#define SCK_0() GPIOA->BRR = GPIO_Pin_5
#define SCK_1() GPIOA->BSRR = GPIO_Pin_5
void _SPI__Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB|RCC_APB2Periph_SPI1 , ENABLE);
//配置SPI1 : SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//SCK配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//MISO配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置片选 IO PA4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//ƬѡÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
PAout(4)=1;
PAout(5)=0;
//配置CONVST GPIO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
PAout(8)=1;
//配置RANGE
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
PBout(5)=1;
//配置REST
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
PBout(7)=1;
//busy
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PB6_BUSY 配置
GPIO_Init(GPIOB, &GPIO_InitStructure);
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;//第二个上升沿采集
SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
SPI_InitStruct.SPI_CRCPolynomial=7;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;//8λ
SPI_InitStruct.SPI_Direction=SPI_Direction_1Line_Rx;//只读
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;//¸高位在前
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
SPI_Init(SPI1,&SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);
ad7606_SetOS(0);//设置是否过采样
ad7606_SetInputRange(0);//设置范围
ad7606_Reset();//硬件复位
AD_CONVST_HIGH();
ad7606_StartConv();//开始转换
}
//设置电压范围0代表正负5V 1代表正负10v
void ad7606_SetInputRange(u8 _ucRange)
{
if (_ucRange == 0)
{
PBout(5) = 0;
}
else
{
PBout(5) = 1;
}
}
//硬件复位函数
void ad7606_Reset(void)
{
int i;
AD_CS_HIGH();
PBout(7)=0;
PBout(7)=1;
for(i=0;i<50;i++) ;
PBout(7)=0;
}
//开始转换函数
void ad7606_StartConv(void)
{
AD_CONVST_HIGH();
AD_CONVST_HIGH();
AD_CONVST_LOW();
AD_CONVST_LOW(); /* μíμçƽ50ns */
AD_CONVST_LOW();
AD_CONVST_LOW();
// delay_ms(5);
AD_CONVST_HIGH();
}
//设置是否过采样函数
void ad7606_SetOS(u8 _ucMode)
{
if (_ucMode == 1)
{
AD_OS2_0();
AD_OS1_0();
AD_OS0_1();
}
else if (_ucMode == 2)
{
AD_OS2_0();
AD_OS1_1();
AD_OS0_0();
}
else if (_ucMode == 3)
{
AD_OS2_0();
AD_OS1_1();
AD_OS0_1();
}
else if (_ucMode == 4)
{
AD_OS2_1();
AD_OS1_0();
AD_OS0_0();
}
else if (_ucMode == 5)
{
AD_OS2_1();
AD_OS1_0();
AD_OS0_1();
}
else if (_ucMode == 6)
{
AD_OS2_1();
AD_OS1_1();
AD_OS0_0();
}
else
{
AD_OS2_0();
AD_OS1_0();
AD_OS0_0();
}
}
//延时函数
void bsp_spiDelay(void)
{
u8 i;
for (i = 0; i<2; i++);
}
//读取8位数据
u8 bsp_spiRead(void)
{
u8 read=0;
u8 i;
for (i = 0; i < 8; i++)
{
SCK_0();//拉低时钟延时
bsp_spiDelay();
read<<=1;
if(PAin(6)==1)
{
read++;
}
SCK_1();//拉高时钟
bsp_spiDelay();
}
return read;
}
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "spi.h"
#include "led.h"
#include "string.h"
//#include "TIMER.h"
u16 ADC_value1[8];//′æ·Å8í¨μàêyÖμ
float pp[2];
char string[20];
int main(void)
{
u8 i;
SystemInit();
LED_Init();
_SPI__Init();
// _TIMER_Init_(4999,7199);
delay_init();
uart_init(115200);
while(1)
{
if(PBin(6)==0)//PB6接busy引脚,判断busy是否为零
{
PAout(5)=1;//拉高时钟线
AD_CS_LOW();//拉低片选
for(i=0;i<1;i++)
{
ADC_value1=bsp_spiRead();
ADC_value1=ADC_value1*256+bsp_spiRead();
pp=(float) ADC_value1/32767*5;
printf("%f
",pp);
}
AD_CS_HIGH();//拉高片选
ad7606_StartConv();//开始转换
}
delay_ms(500);
}
}
[/mw_shl_code]
*********************************************************以上是程序代码,希望各位帮忙指正
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#include "LED.h"
#include "BEEP.h"
/*
PB12: 片选 输出 低电平有效
PB13: 时钟 输出
PB14: MISO 输入
PC1: 复位 输出 高电平有效
PC2: BUSY 输入
PC4: CVA/CVB 输出 低电平有效
PC5: FRST 输入
*/
/*spi配置函数*/
void ad7606_spi_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
//时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能
//管脚配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13复用推挽输出 spi2 时钟
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PB14上拉输入 spi2 miso
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
//初始化
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 15; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
//关闭或开启
SPI_Cmd(SPI2, DISABLE); //失能SPI外设
SPI_Cmd(SPI2, ENABLE); //使能SPI外设
}
/*控制管脚配置函数*/
void ad7606_GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB, ENABLE );
//输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PC4开始转换电平 PC4: CVA/CVB
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PC1 eset复位
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
GPIO_ResetBits(GPIOC,GPIO_Pin_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB12CS片选
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_12);
//输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PC5、frst
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PC2usy
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
}
/*
设置传输速度函数
//SPI 速度设置函数
//SpeedSet:
//SPI_BaudRatePrescaler_2 2分频
//SPI_BaudRatePrescaler_8 8分频
//SPI_BaudRatePrescaler_16 16分频
//SPI_BaudRatePrescaler_256 256分频
*/
void SPI_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI2->CR1&=0XFFC7;
SPI2->CR1|=SPI_BaudRatePrescaler; //设置SPI2速度
SPI_Cmd(SPI2,ENABLE);
}
/*读传输内容函数*/
u16 SPI_ReadTwoByte(void)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
}
/*BUSY中断初始化*/
void ad7606_exti_init(void)
{
EXTI_InitTypeDef EXTI_Structre;
NVIC_InitTypeDef NVIC_Structre;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2);
EXTI_Structre.EXTI_Line=EXTI_Line2;
EXTI_Structre.EXTI_LineCmd=ENABLE;
EXTI_Structre.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_Structre.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_Structre);
NVIC_Structre.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_Structre.NVIC_IRQChannelCmd=ENABLE;
NVIC_Structre.NVIC_IRQChannelPreemptionPriority=2;
NVIC_Structre.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_Structre);
}
/*中断2服务函数*/
extern u16 RESULT[24];
void EXTI2_IRQHandler(void)
{
u8 i=0;
delay_ms(10);
if(EXTI_GetITStatus(EXTI_Line2)==1)
{
AD_CS_0();
for (i = 0; i <24; i++)
{
RESULT[i]=SPI_ReadTwoByte();
// RESULT[i]=RESULT[i]*256+RESULT[i];
//RESULT[i]&=0x7fff;
}
AD_CS_1();
ad7606_Reset();
led1=!led1;
delay_ms(500);
// if(SPI_I2S_GetITStatus(SPI2,SPI_IT_CRCERR)==1)
// {
// beep=1;
// delay_ms(500);
// beep=0;
// }
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
/*ad7606复位函数*/
void ad7606_Reset(void)
{
AD_RESET_LOW();
AD_RESET_HIGH();
AD_RESET_HIGH();
AD_RESET_HIGH();
AD_RESET_HIGH();
AD_RESET_LOW();
}
void ad7606_cv(void)
{
AD_CONVST_HIGH();
AD_CONVST_LOW();
AD_CONVST_LOW();
AD_CONVST_LOW(); /* 连续执行2次,低电平约50ns */
AD_CONVST_HIGH();
}
/*总初始化函数*/
void ad7606_init(void)
{
ad7606_spi_init();
ad7606_GPIO_init();
ad7606_exti_init();
ad7606_Reset();
}
/*某个通道数据函数*/
u16 AD7606_ReadAdc(u8 _ch)
{
u16 sAdc;
sAdc = RESULT[_ch];
return sAdc;
}
一周热门 更多>