网上找的凌志的stm32F103外界7606的代码。接线完成后,将采集到的数据,再OLED屏上显示只会出现,00000和65535并不断循环采集不到别的数据。想问问懂得大佬是什么问题。
这是主代码。
#include <stm32f10x.h>
#include <stdio.h>
#include "Delay.h"
#include "AD7606.h"
#include "OLED.h"
extern u8 Resive_Flag;
u8 IO_TAG=1;
int main(void)
{
uint8_t temp;
s16 DB_data[8] = {0};
uint16_t ad[8] = {0}; // 数组用于存储8个通道的数据
OLED_Init();
GPIO_AD7606_Configuration();
AD7606_Init();
Delay_5ms(100);
while(1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
AD7606_startconvst();
Delay_ns(1);
temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12);
while (temp == Bit_SET)
{
Delay_ns(10);
temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12);
}
AD7606_read_data(DB_data);
for (int i = 0; i < 8; i++)
{
ad[i] = (uint16_t)(DB_data[i]); // 转换数据类型为uint16_t
}
OLED_ShowNum(1,1,ad[0],5);
OLED_ShowNum(2,1,ad[1],5);
Delay_5ms(100);
}
}
这是AD7606.c
#include <stm32f10x.h>
#include "Delay.h"
#include "AD7606.h"
extern u8 IO_TAG;
//-----------------------------------------------------------------
// 初始化程序区
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// void GPIO_AD7606_Configuration(void)
//-----------------------------------------------------------------
//
// 函数功能: AD7606引脚配置函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: RCC_APB2PeriphClockCmd(); GPIO_Init();
// 注意事项: 用GPIO驱动方式和FSMC驱动方式下的引脚配置不一样
//
//-----------------------------------------------------------------
void GPIO_AD7606_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能IO口时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
GPIO_DeInit(GPIOA);//将GPIOx外设寄存器初始化为默认复位值
GPIO_DeInit(GPIOB);
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// AD7606
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 控制线配置
// CS_N RD/SCLK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8| GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// FRSTDATA BUSY
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// rst convstB convstA STby OS12 OS11 OS10
//数据线配置(1)
// DoutA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//-----------------------------------------------------------------
// void AD7606_Init(void)
//-----------------------------------------------------------------
//
// 函数功能: AD7606初始化函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块:
// 注意事项: 无
//-----------------------------------------------------------------
void AD7606_Init(void)
{
convstA_Set;
Delay_1ms(1);
clk_Set;
cs_Set;
OS10_Reset;
OS11_Reset;
OS12_Reset;
AD7606_reset();
Delay_1ms(1);
AD7606_startconvst();
}
/* * 名称:AD7606_startconvst() * 功能:启动转换 */
void AD7606_startconvst(void)
{
convstA_Reset;
Delay_ns (100);
convstA_Set;
}
/* * 名称:AD7606_reset() * 功能:复位模块 */
void AD7606_reset(void)
{
rst_Reset;
Delay_ns (10);
rst_Set;
Delay_1us(1);
rst_Reset;
}
/*
* 名称:AD7606_read_data()
* 功能:读取数据
* 返回值:返回一个结构体指针,该指针为指向结构体数组的首地址
*/
void AD7606_read_data(s16 * DB_data)
{
u8 i,j;
for(i=0;i<8;i++)
{
u16 DB_data1 = 0;
cs_Reset;
Delay_ns(20);
for(j=0;j<16;j++)
{
clk_Reset;
Delay_ns(25);
DB_data1 = ((u16)(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10))<< (15-j)) + DB_data1 ;
clk_Set;
Delay_ns(35);
}
cs_Set;
DB_data[i] = (u16)DB_data1;
}
}
这是AD7606.h
#ifndef _AD7606_H
#define _AD7606_H
#define sampling_0times 0
#define sampling_2times 1
#define sampling_4times 2
#define sampling_8times 3
#define sampling_16times 4
#define sampling_32times 5
#define sampling_64times 6
#define OS10_Set GPIO_SetBits(GPIOB,GPIO_Pin_7)
#define OS10_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define OS11_Set GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define OS11_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define OS12_Set GPIO_SetBits(GPIOB,GPIO_Pin_9)
#define OS12_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define convstA_Set GPIO_SetBits(GPIOB,GPIO_Pin_4)
#define convstA_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_4)
#define rst_Set GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define rst_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define clk_Set GPIO_SetBits(GPIOB,GPIO_Pin_3)
#define clk_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define cs_Set GPIO_SetBits(GPIOA,GPIO_Pin_15)
#define cs_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_15)
#define frstdata_Set GPIO_SetBits(GPIOA,GPIO_Pin_11)
#define frstdata_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_11)
#define busy_Set GPIO_SetBits(GPIOA,GPIO_Pin_12)
#define busy_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_12)
extern void GPIO_AD7606_Configuration(void);
extern void AD7606_Init(void);
extern void AD7606_startconvst(void);
extern void AD7606_reset(void);
extern void AD7606_read_data(s16 * DB_data) ;
#endif
接线都是按照代码接的。就是DB_data数组没有数据。通道接上光敏电阻后也没有任何变化。希望大家懂的帮帮忙看看