STM32/STM8技术论坛
直播中

胡大兴

13年用户 924经验值
擅长:电源/新能源 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器 光电显示 控制/MCU
私信 关注
[问答]

AD7705

求一个STM32F103与AD7705能用的例程谢谢!
已退回10积分

回帖(2)

花不语怪风

2016-10-8 21:52:00
16 位AD转换器,可以多查查资料,现成的不好搞啊
举报

jf_ed1027433

2018-8-16 18:26:01
之前是可以测出值得,测得也是准确的,不知道怎么突然读书为0,我以为是芯片坏了,换了一块AD7705,在读出的数为0Xff,就变为最大了,真的是不知道怎么回事了
  1. /******************** (C) COPYRIGHT 2013 CATTRACE ********************
  2. * 文件名  :ad7705.c
  3. * 描述    :ad7705 应用函数库
  4. *         
  5. * 实验平台:
  6. * 硬件连接:-----------------
  7. *          |   PA2 - CS                 |                         没有
  8. *          |   PA4- DRDY                     |            PC4
  9. *          |   PA5- SLCK              |                    SPI
  10. *          |   PA6 -MISO-DOUT     |                 SPI
  11. *          |   PA7 - MOSI-DIN       |       SPI //修改#define和GPIO定义
  12. *           -----------------
  13. EX:
  14.                 AD7705_Init();
  15.                 temp = ReadAD7705();
  16.                 value = b*3.3/65535;
  17. * 库版本  :ST3.5.0
  18. *
  19. * 作者   :?cattrace  QQ: 1111961
  20. * 博客    : cattrace.tk
  21. **********************************************************************************/
  22. #include "stm32f10x.h"
  23. #include "stm32f10x_spi.h"
  24. #include "AD7705.h"
  25. #include "stdio.h"


  26. u8 SPIx_ReadWriteByte(u8 TxData);          //SPI总线读写一个字节
  27. void RCC_Configuration(void);
  28. void SPIx_Init(void);

  29. void Delay(vu32 nCount)
  30. {
  31.         for(; nCount != 0; nCount--);
  32. }


  33. void GPIO_Configuration(void)                  //DRDY        -PC.5
  34. {
  35.         GPIO_InitTypeDef GPIO_InitStructure;
  36.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                            //这里这个设为上拉输入
  38.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  39.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  40. }

  41. /********配置系统时钟,使能各外设时钟***********/
  42. void RCC_Configuration(void)
  43. {
  44.                  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB                //GPIOA.GPIOC、SPI时钟   由SPI1-SPI2 就是使能时钟
  45.                 |RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO , ENABLE );
  46.                                  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 , ENABLE );//SPI2
  47. }

  48. /********AD7705初始化函数***********/          //AD通道1初始化
  49. void AD7705_Init(void)
  50. {         
  51.         unsigned char i ;
  52.         for(i=0;i<100;i++)
  53.         {
  54.     SPIx_ReadWriteByte(0xFF);        //持续DIN高电平写操作,恢复AD7705接口。启动传输
  55.         }
  56.         SPIx_ReadWriteByte(0x20) ;       //通道1 ,下一个写时钟寄存器
  57.         Delay(20);
  58.         SPIx_ReadWriteByte(0x07) ;       //写时钟寄存器设置更新速率为200Hz-改为100hz
  59.         Delay(20);
  60.         SPIx_ReadWriteByte(0x10) ;       //通道1 ,下一个写设置寄存器
  61.         Delay(20);
  62.         SPIx_ReadWriteByte(0x44) ;       //写设置寄存器 ,设置成双极性、无缓冲、增益为0、滤波器工作、自校准
  63.         Delay(20);
  64. }
  65. /********AD7705_2初始化函数***********/
  66. void AD7705_2(void)
  67. {
  68.     unsigned  char i;
  69.         for(i=0;i<100;i++)
  70.         {
  71.         SPIx_ReadWriteByte(0xFF);        //持续DIN高电平写操作,恢复AD7705接口
  72.         }
  73.         delay_ms(10);
  74.         SPIx_ReadWriteByte(0x21) ;                 //通道2,下一个写时钟寄存器
  75.         Delay(20);
  76.         SPIx_ReadWriteByte(0x07) ;                 //写时钟寄存器速率为100HZ
  77.         Delay(20);
  78.         SPIx_ReadWriteByte(0x11) ;       //通道2 ,下一个写设置寄存器
  79.         Delay(20);
  80.         SPIx_ReadWriteByte(0x44) ;       //写设置寄存器 ,设置成双极性、无缓冲、增益为0、滤波器工作、自校准
  81.         Delay(20);
  82. }
  83. /********读16位数据************/
  84. u16 ReadAD7705_16BitValue(void)
  85. {
  86.         unsigned long DataL = 0;
  87.         unsigned long DataH = 0;
  88.         unsigned long Ret = 0;
  89.         DataH = SPIx_ReadWriteByte(0xFF);                                          //测数据
  90.         DataH = DataH << 8;
  91.         DataL = SPIx_ReadWriteByte(0xFF);
  92.         Ret = DataH | DataL;
  93.         return(Ret) ;                             
  94. }
  95. /********读取AD7705第一通道数据************/
  96. u16 ReadAD7705(void)
  97. {
  98.         unsigned long Ret = 0;
  99.     AD7705_Init();                //初始化通道1
  100.         Delay(100);
  101.         SPIx_ReadWriteByte(0x38);                             //设置读当前通道数据-通道1的
  102.         while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5 == 1));        //转换结束
  103.         Ret = ReadAD7705_16BitValue();
  104.         return Ret;
  105. }
  106. /********读取AD7705第二通道数据************/
  107. u16 ReadAD2(void)
  108. {
  109.         unsigned long Ret = 0;
  110.         AD7705_2();                   //初始化通道2
  111.         Delay(100);
  112.         SPIx_ReadWriteByte(0x39);                              //设置读当前通道数据-通道2的
  113.         while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5 == 1));        //转换结束         DRDY
  114.         Ret = ReadAD7705_16BitValue();
  115.         return Ret;
  116. }
  117. /****************************SPI初始化*************************/

  118. //SPI口初始化
  119. //这里针是对SPI1的初始化
  120. void SPIx_Init(void)
  121. {         
  122.         SPI_InitTypeDef  SPI_InitStructure;
  123.         GPIO_InitTypeDef GPIO_InitStructure;

  124.         /* Configure SPI1 pins: SCK, MISO and MOSI */ //SCLK,DIN,DOUT
  125.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;        //  ??? 这里的14脚是AD的输出给单片机,单片机应该设置为输入
  126.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  127.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  128.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  129.         GPIO_SetBits(GPIOC,GPIO_Pin_5);
  130.         SPI_Cmd(SPI2, DISABLE); //不使能SPI外设        自己加上
  131.         /* SPI1 configuration */
  132.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  133.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
  134.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
  135.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //选择了串行时钟的稳态:时钟悬空高
  136.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //数据捕获于第二个时钟沿
  137.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  138.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;                //定义波特率预分频的值:波特率预分频值为256
  139.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  140.         SPI_InitStructure.SPI_CRCPolynomial = 7;            //CRC值计算的多项式
  141.         SPI_Init(SPI2, &SPI_InitStructure);             //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  142.         /* Enable SPI2  */
  143.         SPI_Cmd(SPI2, ENABLE); //使能SPI外设
  144.     SPIx_ReadWriteByte(0xFF);//启动传输                 
  145. }  


  146. //SPIx 读写一个字节
  147. //TxData:要写入的字节
  148. //返回值:读取到的字节
  149. u8 SPIx_ReadWriteByte(u8 TxData)
  150. {               

  151.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); //检查指定的SPI标志位设置与否:发送缓存空标志位
  152.         /* Send byte through the SPI1 peripheral */
  153.         SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
  154.         /* Wait to receive a byte */
  155.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志
  156.         /* Return the byte read from the SPI bus */
  157.         return SPI_I2S_ReceiveData(SPI2);   //返回通过SPIx最近接收的数据                                    
  158. }

  159. /********AD7705完整初始化函数***********/
  160. void AD7705_AllInit(void)
  161. {
  162.         RCC_Configuration();
  163.         GPIO_Configuration();
  164.         SPIx_Init();
  165. }









[/td][/tr]
[tr][td]收藏

[/td][/tr]
[/table]
举报

更多回帖

发帖
×
20
完善资料,
赚取积分