OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6480|回复: 11

STM32驱动AD7707程序设计

[复制链接]

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-6
在线时间
0 小时
发表于 2015-5-18 11:13:30 | 显示全部楼层 |阅读模式
5金钱
STM32驱动AD7707程序设计,出现不了预期效果。求大神们看看程序哪里有问题……

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-6
在线时间
0 小时
 楼主| 发表于 2015-5-18 11:15:32 | 显示全部楼层

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"


#define uchar unsigned char
#define uint unsigned int
  
#include "stm32f10x.h"    //stm32固件库函数

uchar Timer0Val;
long sum;
uchar shu[5];
double m;
char n;
long o;
u8 SCK=GPIO_Pin_0;               //clk          IO输出  蓝
//u8 DRDY=GPIO_Pin_1;              //读取管脚电平,输入IO   灰
//u8 SO=GPIO_Pin_2;                //AD 输出out    读取管脚电平,输入IO
u8 SI=GPIO_Pin_3;                //din           IO输出
#define DRDY GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1)
#define SO   GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)

void delayms(int xms) //延时XMS=1 1MS
{
 uchar i,j;
   for (i = xms;i>0;i--)
   for(j = 110;j>0;j--);

}

void gpio(void)
 { 
    GPIO_InitTypeDef  GPIO_InitStructure;
    delay_init();  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  //使能GPIOE端口时钟
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   //BEEP-->E.3 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    //推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度为50MHz
   GPIO_Init(GPIOE, &GPIO_InitStructure);                         //根据参数初始化GPIOE.1
 
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   //BEEP-->E.0 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    //推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度为50MHz
   GPIO_Init(GPIOE, &GPIO_InitStructure);                         //根据参数初始化GPIOE.0
 
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;   //BEEP-->E.1 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空输入
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度为50MHz
   GPIO_Init(GPIOE, &GPIO_InitStructure);                         //根据参数初始化GPIOE.3
 
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;   //BEEP-->E.2 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空输入
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度为50MHz
   GPIO_Init(GPIOE, &GPIO_InitStructure);                         //根据参数初始化GPIOE.2
 
}


void WriteADReg(uchar Data) 
{
 uchar i;
 SCK=1;
 for (i=0;i<8;i++)
 {
  SCK=0; //拉低SCLK,直接开始写数据
     //delayms(1);
     if(Data & 0x80)  //1000 0000
//从最高位开始写,先判断是否为1
      SI=1;  //写  1
     else
   SI=0;  //写  0
        delayms(100);
     SCK=1;
  delayms(100);
 
     Data <<= 1;
  //循环左移,开始写第二位
 }        
    SCK = 1;
}

 

 


/*********AD相关函数**********/
//初始化 AD
void InitAD()
{
 SCK=1;
 SI=1;   //DIN
 WriteADReg(0x23);   //AD7707初始化-读第1通道A/D转换值下写时钟寄存器
 delayms(100);
 WriteADReg(0x1b);//改刷新频率为20 不分频  18
 delayms(100);
 WriteADReg(0x13);//下写setup寄存器
 delayms(100);
 WriteADReg(0x40); //双极性,无缓冲,滤波同步44  
 delayms(100);
}

/*写AD寄存器程序*/


/*********读AD数据*******/
uint ReadADVal(void) 
{
 uchar i;
 uint ADVal = 0;

 WriteADReg(0x3b);

 while(DRDY); 
//DRDY为0时,开始读数
//AD的DRDY 已经输出0,但还是不读数

 SCK = 1;
 for(i = 0;i < 16;i++)
 { 
  ADVal <<= 1;
        SCK=0;
       delayms(100);
   
  ADVal |= SO;

  SCK=1;
        delayms(100);
    }

 SCK = 1;
 //w = 0x32;
 return ADVal;
//得到的是一位16位二进制数,需转换为10进制
}
void DataProcess()

 sum = ReadADVal();      //数组sum为AD采集得到的数据,需要显示出来      
 m=(sum-32768)/1638.375; //转化为十进制的数
}

/***显示函数****/
void Display()

 
                     
 
  DataProcess();   
    
       
 LCD_ShowString(30,130,200,16,16,"2015"); 
       LCD_ShowxNum(30,160,m,4,16,0); //显示数字 
    
    
  delay_ms(1000);
}   


int main()
{
   delay_init();       //延时函数初始化  
 NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
 uart_init(9600);   //串口初始化为9600
  LED_Init();        //LED端口初始化
 LCD_Init();
 OINT_COLOR=RED;
  LCD_Clear(YELLOW);
 
 //Timer0Init();
 //DataProcess();
 while(1)
 {
 
  Display();
  
 }
}

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-19 01:12:20 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-6
在线时间
0 小时
 楼主| 发表于 2015-5-19 16:34:06 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,我管脚配置那个地方有没有问题啊,输入输出是同样的配置方法么?

那样将读取的管脚电平值赋给“DRDY”,的写法有问题没?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-5-19
在线时间
3 小时
发表于 2015-5-19 20:57:47 | 显示全部楼层
肯定不行,你SO,SI不应该是一个引脚吗,7707数据是一根线,写的时候定义为输出,读的时候定义为输入。还有时钟你定义的是啥意思啊,不应该是引脚的写函数吗?                                 (其实我是想问你用7707来干啥)
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-6
在线时间
0 小时
 楼主| 发表于 2015-5-21 10:58:14 | 显示全部楼层
回复【5楼】清风一林:
---------------------------------
7707上SO/SI是俩引脚啊,7707进行AD转换之后将数据传给STM32,将其显示出来
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-6
在线时间
0 小时
 楼主| 发表于 2015-5-21 10:58:52 | 显示全部楼层
回复【5楼】清风一林:
---------------------------------
大神可有程序,给小弟借鉴一下啊
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-6
在线时间
0 小时
 楼主| 发表于 2015-5-24 17:28:24 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,我看有人说51与STM32的延时不一样。可我改了之后,我调试了好久,还是出不来结果,求问程序里的问题出在哪里~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-24 23:00:39 | 显示全部楼层
回复【8楼】风风无痕:
---------------------------------
示波器对比下两者的波形吧,看看SCK频率一样不。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-6
在线时间
0 小时
 楼主| 发表于 2015-5-25 18:18:06 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
恩恩,示波器看了一下果然不行。原子哥,使能时钟信号之后,怎么样能把时钟信号捣出来呢(连到外接AD芯片上),是哪个管脚啊,还需要其他程序么
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-26 00:05:17 | 显示全部楼层
回复【10楼】风风无痕:
---------------------------------
发数据,就会产生时钟
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-6
在线时间
0 小时
 楼主| 发表于 2015-5-26 09:37:31 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
那是不是我把某一个管脚(比如PE.0)定义为推挽输出,然后用导线将它与外设某管脚相连,这时钟信号自然就传过去了呢?还是需要其他的定义……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 00:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表