我尝试过模拟方式,可以采样,但是工作不久基准电压就消失了。不知道是否是芯片损坏。其次我尝试用硬件SPI方式通讯,但是始终无法通讯,程序内容如下(部分常见配置省略),请各位大神指点,如果需要完整程序,请留言谢谢:
#include "stm32f10x_lib.h"
#include <stdio.h>
/******************ads1247引脚设置*******************/
#define CS_0 GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#define CS_1 GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define START_1 GPIO_SetBits(GPIOB, GPIO_Pin_10)
#define START_0 GPIO_ResetBits(GPIOB, GPIO_Pin_10)
#define DRDY GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)
void RCC_init(void);
void GPIO_init(void);
void USART_init(void);
void M3SPI_init(void);
void ADS1247_init(void);
void delay_ms(u16 time_cn);
u32 ADS1247_Read();
char WaitBusy();
void SPI2_WriteReg(char RegAddr,char *Buffer,char Length);
void SPI2_ReadReg(char RegAddr,char *Buffer,char Length);
void SPI2_ReadBytes(char *RxBuffer,char RxLenth);
void SPI2_WriteBytes(char *TxBuffer,char TxLenth);
void ADS1247_WriteCmd(char Cmd);
#define uint8 unsigned char 8;
#define uint16 unsigned char 16;
u32 D;
#define buffersize 529 //缓冲区大小,目前只用到4个字节
vu8 SPI2_RX_Buff[buffersize] = { 0 }; //接收缓冲区初始化
vu8 SPI2_TX_Buff[buffersize] = { 0 }; //发送缓冲区初始化
void main()
{
RCC_init();/* 设置系统时钟 */
GPIO_init();
USART_init();
START_1;
M3SPI_init();
ADS1247_init();
while(1)
{
D=ADS1247_Read();
printf(" %d\r\n",D);
START_0;
delay_ms(500);
START_1;
}
}
void M3SPI_init(void)
{
SPI2->CR1 |= 0<<10 ; //全双工模式
SPI2->CR1 |= 0<<9 ; //硬件nss管理
SPI2->CR2 |= 1<<2 ; //SS输出使能
CS_0;
SPI2->CR1 |= 1<<2 ; //SPI主机
SPI2->CR1 |= 0<<11 ; //数据格式:8bit
SPI2->CR1 |= 1<<1 ; //CPOL=1:空闲模式下SCK为高电平
SPI2->CR1 |= 1<<0 ; //CPHA=1:数据采样从第二个时间边沿开始
SPI2->CR1 |= 2<<3 ; //Fsck=Fcpu/8
SPI2->CR1 |= 0<<7 ; //MSBfirst
//SPI2->CR2 |= 1<<1 ; //发送缓冲区DMA使能
//SPI2->CR2 |= 1<<0 ; //接收缓冲区DMA使能
SPI2->CR1 |= 1<<6 ; //SPI设备使能
}
void ADS1247_init(void)
{
delay_ms(100);
char cmd;
ADS1247_WriteCmd(ADC_CMD_RESET);
delay_ms(10);
cmd=0x13;
SPI2_WriteReg(ADS1248_REG_MUX0,&cmd,1);
char WaitBusy();
/*cmd=0;
SPI2_WriteReg(ADS1248_REG_VBIAS,&cmd,1);
char WaitBusy();
delay_ms(10);*/
cmd=0x30;
SPI2_WriteReg(ADS1248_REG_MUX1,&cmd,1);
char WaitBusy();
delay_ms(10);
/* cmd=0xff;
SPI2_WriteReg(ADS1248_REG_IDAC1,&cmd,1);
char WaitBusy();
delay_ms(10);*/
/*cmd=0x00;
SPI2_WriteReg(ADS1248_REG_IDAC0,&cmd,1);
char WaitBusy();
delay_ms(10);*/ //默认设置
cmd=0x02; //0000 0010 增益1倍 20SPS
SPI2_WriteReg(ADS1248_REG_SYS0,&cmd,1);
char WaitBusy();
delay_ms(10);
}
void SPI2_ReadReg(char RegAddr,char *Buffer,char Length)
{
char Cmd[2];
CS_0;
Cmd[0]=ADC_CMD_RREG|RegAddr;
Cmd[1]=Length-1;
SPI2_WriteBytes(Cmd,2);
SPI2_ReadBytes(Buffer,Length);
Cmd[0]=ADC_CMD_NOP;
SPI2_WriteBytes(Cmd,1);
CS_1;
}
void SPI2_WriteReg(char RegAddr,char *Buffer,char Length)
{
char Cmd[2];
CS_0;
Cmd[0]=ADC_CMD_WREG|RegAddr;
Cmd[1]=Length-1;
SPI2_WriteBytes(Cmd,2);
SPI2_WriteBytes(Buffer,Length);
CS_1;
}
void SPI2_WriteBytes(char *TxBuffer,char TxLenth)
{
char i;
while(TxLenth--)
{
while(( SPI2->SR & SPI_SR_TXE )==0);
SPI2->DR=*TxBuffer++;
while(( SPI2->SR & SPI_SR_RXNE)==0);
i=SPI2->DR;
}
i++;
}
void SPI2_ReadBytes(char *RxBuffer,char RxLenth)
{
while(RxLenth--)
{
while(( SPI2->SR & SPI_SR_TXE)==0);
SPI2->DR=*RxBuffer;
while(( SPI2->SR & SPI_SR_RXNE)==0);
*RxBuffer++=SPI2->DR;
}
}
void ADS1247_WriteCmd(char Cmd)
{
CS_0;
SPI2_WriteBytes(&Cmd,1);
CS_1;
}
u32 ADS1247_Read()
{
char Cmd[5];
Cmd[0]=ADC_CMD_RDATA;
Cmd[1]=ADC_CMD_NOP;
Cmd[2]=ADC_CMD_NOP;
Cmd[3]=ADC_CMD_NOP;
Cmd[4]=ADC_CMD_NOP;
CS_0;
SPI2_ReadBytes(Cmd,5);
CS_1;
Cmd[0]= (Cmd[1]&0x80)!=0 ? 0xFF:0x00;
D=Cmd[0]<<24 || Cmd[1]<<16 || Cmd[2]<<8 ||Cmd[3];
return D;
}
void delay_ms(u16 time_cn)
{
u32 temp = time_cn*10000;
while(temp--);
}
int fputc(int ch, FILE *f)
{
/* 将Printf内容发往串口 */
USART_SendData(USART1, (unsigned char) ch);
// while (!(USART1->SR & USART_FLAG_TXE));
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return (ch);
}
char WaitBusy()
{
char i;
i=0;
while(DRDY>0)
{
delay_ms(10);
i++;
if(i>21)return 1;
}
return 0;
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
/* 打开 GPIOA,GPIOB,USART1 时钟 */
}
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 设置引脚 START*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 设置 SPI2 引脚: SCK, MISO 和 MOSI,NSS */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIOB->ODR |= 7<<13; //PB13,14,15上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 设置SPI2引脚 DRDY*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*GPIOA9、10为串口配置端口*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
|