请教,硬件SPI通信读取值一直是0XFFFF
————————————ad7606.c——————————————
#include "ad7606.h"
#include "spi.h"
#include "delay.h"
#include "usart.h"
#include "stm32f4xx_hal_gpio.h"
/* 仅允许本文件内调用的函数声明 */
u16 s_adc_now[8];
void AD7606_ConfigGPIO(void)
{
GPIO_InitTypeDef GPIO_Initure;
AD_CS_GPIO_CLK;
AD_RESET_GPIO_CLK;
AD_CONVST_GPIO_CLK;
AD_RANGE_GPIO_CLK;
AD_BUSY_GPIO_CLK;
AD_OS0_GPIO_CLK;
AD_OS1_GPIO_CLK;
AD_OS2_GPIO_CLK;
//PF6 CS
GPIO_Initure.Pin=AD_CS_PIN;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(AD_CS_GPIO_PORT,&GPIO_Initure);
//RESET
GPIO_Initure.Pin=AD_RESET_PIN;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(AD_RESET_GPIO_PORT,&GPIO_Initure);
//CONVST
GPIO_Initure.Pin=AD_CONVST_PIN;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(AD_CONVST_GPIO_PORT,&GPIO_Initure);
//RANGE
GPIO_Initure.Pin=AD_RANGE_PIN;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(AD_RANGE_GPIO_PORT,&GPIO_Initure);
//BUSY
GPIO_Initure.Pin=AD_BUSY_PIN;
GPIO_Initure.Mode=GPIO_MODE_INPUT;
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(AD_BUSY_GPIO_PORT,&GPIO_Initure);
//OS0-2
GPIO_Initure.Pin=AD_OS0_PIN;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_PULLDOWN;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(AD_OS0_GPIO_PORT,&GPIO_Initure);
GPIO_Initure.Pin=AD_OS1_PIN;
HAL_GPIO_Init(AD_OS1_GPIO_PORT,&GPIO_Initure);
GPIO_Initure.Pin=AD_OS2_PIN;
HAL_GPIO_Init(AD_OS2_GPIO_PORT,&GPIO_Initure);
}
/*_ucMode : 0-6 0表示无过采样,1表示2倍,2表示4倍,3表示8倍,4表示16倍,5表示32倍,6表示64倍*/
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 /* 按0处理 */
{
AD_OS2_0();
AD_OS1_0();
AD_OS0_0();
}
}
/*配置AD7606模拟信号输入量程,形参: _ucRange : 0 表示正负5V 1表示正负10V */
void AD7606_SetInputRange(u8 _ucRange)
{
if (_ucRange == 0)
{
AD_RANGE_5V(); /* 设置为正负5V */
}
else
{
AD_RANGE_10V(); /* 设置为正负10V */
}
}
void AD7606_Reset(void)
{
/* AD7606是高电平复位,要求最小脉宽50ns */
AD_RESET_LOW();
AD_RESET_HIGH();
AD_RESET_HIGH();
AD_RESET_HIGH();
AD_RESET_HIGH();
AD_RESET_LOW();
}
void AD7606_StartConv(void)
{
/* 上升沿开始转换,低电平持续时间至少25ns */
AD_CONVST_HIGH();
AD_CONVST_HIGH();
AD_CONVST_LOW();
AD_CONVST_LOW();
AD_CONVST_LOW();
AD_CONVST_LOW(); /* 连续执行2次,低电平约50ns */
AD_CONVST_HIGH();
}
/*扫描调用本函数,用于读取AD转换器数据*/
void AD7606_Scan(void) /* 此函数代码按照时序编写 */
{
uint8_t i;
/* BUSY = 0 时.ad7606处于空闲状态ad转换结束 */
if (BUSY_IS_LOW())
{
AD_CS_LOW(); /* SPI片选 = 0 */
for (i = 0; i < CH_NUM; i++)
{
s_adc_now[i] = SPI5_ReadWriteByte(0xff);
s_adc_now[i] = s_adc_now[i] * 256 + SPI5_ReadWriteByte(0xff); /* 读数据 */
}
AD_CS_HIGH(); /* SPI片选 = 1 */
AD7606_StartConv(); /* 给开始信号 */
}
}
/**/
u16 AD7606_ReadAdc(uint8_t _ch)
{
u16 sAdc;
sAdc = s_adc_now[_ch];
return sAdc;
}
void AD7606_Init(void)
{
SPI5_Init();
AD7606_ConfigGPIO();
AD7606_SetInputRange(1);
AD7606_SetOS(0);
AD7606_Reset();
AD_CONVST_HIGH();
}
void Demo_spi_AD7606(void)
{
AD7606_Init(); /* 配置AD7606所用的GPIO */
}
————————————main.c——————————————
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "ad7606.h"
#include "spi.h"
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SDRAM_Init(); //初始化SDRAM
Demo_spi_AD7606();
u16 n;
u8 unitPlace;
u8 tenPlace;
u8 hundredPlace;
u8 thousandPlace;
u8 tenthousandPlace;
while(1)
{
AD7606_Scan();
n=AD7606_ReadAdc(0);
//AD7606_Mak();
//AD7606_Disp();
unitPlace = (n / 1 )% 10;
tenPlace = (n / 10 )% 10;
hundredPlace = (n / 100) % 10;
thousandPlace = (n / 1000) % 10;
tenthousandPlace = (n / 10000) % 10;
printf("%d\%d\%d\%d\%d\ ",tenthousandPlace,thousandPlace,hundredPlace,tenPlace,unitPlace);
}
}
使用STM32F429IGT6,硬件接线如下
+5V <------ 5.0V 5V供电
GND ------- GND 地
CS <------ PF6 SPI_CS
RD/SCLK <------ PF7 SPI_SCLK
DB7/DOUT ------> PF8 SPI_MISO
RAGE <------ PE7 模拟信号输入量程
RST <------ PA6 复位信号
CVA CVB <------ PB1 启动AD转换
OS0 <------ GND 过采样引脚0(默认接地)
OS1 <------ GND 过采样引脚1(默认接地)
OS2 <------ GND 过采样引脚2(默认接地)
BUSY ------> PA0 BUSY信号
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>