[mw_shl_code=c,true]#include "main.h"
//#include "AD9833.h"
//#include "DAC.h"
#include "pwm.h"
#include "key.h"
#include "stm32f10x.h"
#include "stm32f10x_spi.h"
u16 b;
float c;
//AD7705.h
#ifndef __SPI1_H
#define __SPI1_H
#define CS_ADC_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_4) /*片选*/
#define CS_ADC_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_4)
u8 SPIx_ReadWriteByte(u8 TxData);
void delay_ms(u16 time);
void delay_us(u16 time);
void SPIx_Init(void);
void AD7705_WriteByte(u8 Dst_Addr);
void Init_AD7705(u8 chnanel);
u16 GetData7705_CH1(void);
u16 GetData7705_CH2(void);
#endif /* __SPI1_H */
//AD7705.C
//#include "AD7705.h"
//#include "stm32f10x.h"
/*
SPI1_NSS PA4 CS ;
SPI1_SCK PA5 CLK ;
SPI1_MISO PA6 DOUT ;
SPI1_MOSI PA7 DIN ;
PA8 DRDY ;
*/
void SPIx_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;// AdDrdy
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;//PA8配置成上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//SPI CS DAC8554 AD7705
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SPI_Cmd(SPI1, DISABLE); //失能SPI外设
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //时钟悬空为高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //波特率预分频值256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure); //SPI寄存器的初始化
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
CS_ADC_LOW();
SPIx_ReadWriteByte(0xff); //启动传输
CS_ADC_HIGH();
}
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPIx_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI1, TxData); //发送数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1); //返回接收到的数据
}
//写数据
void AD7705_WriteByte(u8 Dst_Addr)
{
CS_ADC_LOW(); //使能器件
delay_us(20);
SPIx_ReadWriteByte(Dst_Addr);
delay_us(100);
CS_ADC_HIGH();//失能
}
/********AD7705初始化函数***********/
void Init_AD7705(u8 chnanel)
{
u8 i;
for(i=0;i<100;i++)/*多于连续32个DIN=1使串口复位*/
{
AD7705_WriteByte(0xff);//持续DIN高电平写操作,恢复AD7705接口
}
delay_ms(1);
switch(chnanel)
{
case 1:
AD7705_WriteByte(0x20); /* 写通讯寄存器选中ch1*/
AD7705_WriteByte(0x04);//0x04 /* 1MHz时钟,200Hz数据更新速率*/
AD7705_WriteByte(0x10); /*选择设置寄存器,使用chnanel 1*/
AD7705_WriteByte(0x44); //写设置寄存器,设置成单极性,无缓冲,增益为1,滤波器工作,自校准
break;
case 2:
AD7705_WriteByte(0x21); /* 写通讯寄存器选中ch2 */
AD7705_WriteByte(0x04); /* 1MHz时钟,200Hz数据更新速率*/
AD7705_WriteByte(0x11); /*选择设置寄存器,使用chnane 2*/
AD7705_WriteByte(0x44); //写设置寄存器,设置成单极性,无缓冲,增益为1,滤波器工作,自校准
break;
default:
break;
}
}
/* 读AD7705转换数据输入通道channel */
u16 GetData7705_CH1(void)
{
u16 temp1 = 0;
u16 DataL = 0;
u16 DataH = 0;
Init_AD7705(1); //初始化通道1
delay_ms(1);
AD7705_WriteByte(0x38); //选中CH1数据寄存器读
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==1) //等待数据准备好
{
}
CS_ADC_LOW(); //使能器件
delay_us(20);
DataH = SPIx_ReadWriteByte(0xff);
DataL = SPIx_ReadWriteByte(0xff);
delay_us(200);
CS_ADC_HIGH(); //片选取消
DataH = DataH << 8;
temp1 = DataH | DataL;
return temp1;
}
/* 读AD7705转换数据输入通道channe2
u16 GetData7705_CH2(void)
{
u16 temp2 = 0;
u16 DataL = 0;
u16 DataH = 0;
Init_AD7705(2); //初始化通道2
delay_ms(1);
AD7705_WriteByte(0x39); //选中CH2数据寄存器读
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==1) //等待数据准备好
{
}
CS_ADC_LOW(); //使能器件
delay_us(20);
DataH = SPIx_ReadWriteByte(0xff);
DataL = SPIx_ReadWriteByte(0xff);
delay_us(200);
CS_ADC_HIGH(); //片选取消
DataH = DataH << 8;
temp2 = DataH | DataL;
return temp2;
}
*/
void delay_us(u16 time)
{
u16 i=0;
while(time--)
{
i=10;
while(i--);
}
}
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000;
while(i--);
}
}
/////////////////主函数////////////////主函数//////////////主函数//////////////////////
int main(void)
{
// u8 kai=0,guan=0,qidong=1,i=2;
SysTick_Init(); //初始化系统滴答定时器
LED_GPIO_Config(); //LED端口初始化
LCDGPIO_Configuration();//LCD初始化
Key_GPIO_Config();
PWM_Init();
SPIx_Init();
Init_AD7705(1);
// ADC1_Init();
// ADC_LocalValue =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的 AD 值
// AD9833_Output(1000000);
// LCDmain();
LCDDisplay(0, 0,"电压:");
Dis_float16(1,0,c);
LCDDisplay(1, 4, "V");
// GPIO_ResetBits(GPIOE,GPIO_Pin_14);
// GPIO_ResetBits(GPIOE,GPIO_Pin_15);
GPIO_SetBits(GPIOE,GPIO_Pin_14);
GPIO_SetBits(GPIOE,GPIO_Pin_15);
//GPIO_SetBits(GPIOD,GPIO_Pin_3);
while(1)
{
Init_AD7705(1);
b = GetData7705_CH1();
c = b*2.5/65535;
Dis_float16(1,0,c);
}
}
[/mw_shl_code]
|