标题:
stm32f103c8t6最小系统驱动ads8681(ads8685,ads8689)测试程序
[打印本页]
作者:
WP_51
时间:
2021-7-26 18:20
标题:
stm32f103c8t6最小系统驱动ads8681(ads8685,ads8689)测试程序
实验器材:
stm32f103c8t6最小系统,ads8681(ads8685,ads8689)
实验目的:
以硬件spi1驱动该ADC芯片工作读取数据
硬件资源:
1.ads8681外围电路请查看官方文档设计。
2.引脚连接如下:
stm32f103c8t6 ads8681(AD)
PA5-----------------AD_SCK
硬件spi1引脚 PA6----------------AD_SDO_0
PA7-----------------AD_SDI
PB10----------------AD_RVS
PB11----------------AD_RST
PB12----------------AD_CS
其它说明:
1.本实验只测试了ads8681芯片.根据官方文档或可驱动ads8685以及ads8689芯片,具体请自行测试;
2.由于stm32f103c8t6的硬件spi时钟最多为18Mhz,所以未能测试ads8681官方文档所标注的1Msps采样率;
3.代码中驱动该adc芯片采用的是:Standard SPI with CPOL = 0 and CPHASE = 0 模式,如有需要请自行更改配置;
4.若使用更高速率单片机驱动,请自行研究移植,基本思路一致。
注意事项:
注意驱动电压:
注意正负极连接短路!
STM32单片机源程序如下:
#include "ADS8681.h"
#include "spi.h"
#include "delay.h"
// 复位
void ADS8681_RST(){
AD_RST = 0;
delay_ms(30);
AD_RST = 1;
delay_ms(30);
}
void ADS8681_Init(){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12; //RST CS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//RVS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
SPI1_Init();
//AD_SCK=0;
ADS8681_RST();
ADS8681_Write_Register(0x14,0x000b);//配置电压测量范围,具体对应地址位14H的寄存器内容
}
//写寄存器
void ADS8681_Write_Register(u8 Addr,u16 data) // 11010_00_<9-bit address>_<16-bit data>
{
u16 retry = 0;
AD_CS = 1;
AD_CS = 0;
while(AD_RVS){//判断RVS状态,下同
retry++;
if(retry>=0XFFFE)
break;
}
SPI1_ReadWriteByte((0xD0<<8)|Addr);
SPI1_ReadWriteByte(data&0xffff);
AD_CS = 1;
}
// 读寄存器
u16 ADS8681_Read_Register(u8 Addr) // 11001_xx_<9-bit address>_00000000_00000000
{
u16 data1,data2;
u16 retry = 0;
AD_CS = 0;
while(AD_RVS){
retry++;
if(retry>=0Xff)
break;
}
SPI1_ReadWriteByte((0xC8<<8)|Addr);
SPI1_ReadWriteByte(0x0000);
AD_CS = 1;
retry = 0;
while(!AD_RVS){
retry++;
if(retry>=0Xff)
break;
}
AD_CS = 0;
retry = 0;
while(AD_RVS){
retry++;
if(retry>=0Xff)
break;
}
data1 = SPI1_ReadWriteByte(0x00);//低16位
data2 = SPI1_ReadWriteByte(0x00);//高16位
AD_CS = 1;
return (data2<<16)|data1;
}
// 读取ads8681采样值
u32 ADS8681_Read_ConversionData()
{
u16 data;
u16 retry = 0;
AD_CS = 1;
while(!AD_RVS){
retry++;
if(retry>=0xfffe)
break;
}
AD_CS = 0;
retry = 0;
while(AD_RVS){
retry++;
if(retry>=0xfffe)
break;
}
data = SPI1_ReadWriteByte(0x00);//里边的地址任意,该处主要是读取数据
return data;
}
复制代码
致谢:
感谢相关人员提供的思路以及支持!
声明:
只为提高技术,欢迎交流,不参与撕逼,如有雷同,纯属巧合。
全部代码下载:
C8T6_ADS8681硬件spi.7z
(187.23 KB, 下载次数: 175)
2021-7-26 18:40 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1