实验器材:
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)
|