ADS8866的实际调试过程。

       首先是为什么选用这个adc,这颗adc看起来性价比很高的,100k,16位,INL:1LSB,这个是单极性的,如果想用差分的可以选用ADS8867。

下面根据数据手册说明,贴上我的驱动代码:

首先是spi的驱动,我用的硬件spi1外设。

void Spi1_Init(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE );//PORTA时钟使能 
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_SPI1,  ENABLE ); 	
	//GPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
	
	GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6);  //没有作用的!!!!因为只有复用的外设才可以操作这个io口

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;  //设置SPI单向的数据模式
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master ;		//设置SPI工作模式:设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;		//设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;	
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
	//SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
//	SPI_Cmd(SPI1, ENABLE); //使能SPI外设
	
	//SPI1_ReadWriteByte(0xff);//启动传输		 
  Spi1_SetSpeed(SPI_BaudRatePrescaler_16);
	SPI_Cmd(SPI1, ENABLE);
	SPI_Cmd(SPI1, DISABLE); //使能SPI外设

}   
//SPI 速度设置函数
//SpeedSet:
//SPI_BaudRatePrescaler_2   2分频   
//SPI_BaudRatePrescaler_8   8分频   
//SPI_BaudRatePrescaler_16  16分频  
//SPI_BaudRatePrescaler_256 256分频 
  
void Spi1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
	SPI1->CR1&=0XFFC7;
	SPI1->CR1|=SPI_BaudRatePrescaler;	//设置SPI1速度 
	SPI_Cmd(SPI1,ENABLE); 

} 

这里就是要注意:  

 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;    

这个工作模式是根据ADS886的通讯逻辑决定的。我用的72的stm32f103rb,这里的 Spi1_SetSpeed(SPI_BaudRatePrescaler_16);就是spi的clk有72/16=4.5M左右,我遇到一个问题,就是我想要更高的速度

8分频或者4分频的时候,发现示波器测sdo引脚有数据的,但是spi得DR寄存器里面没有接收到数据,暂时还没有找到出现这种问题的原因,后面有时间再找这里的原因。

下面是ADS886的驱动逻辑:

 SPI_Cmd(SPI1, ENABLE);		
						
					GPIOA->BSRR=0x0010;		 
					
					delay_us(1);
						
					SPI_Cmd(SPI1, DISABLE);
						
					delay_us(1);
						
					GPIOA->BRR=0x0010;

					SPI_Cmd(SPI1, ENABLE);		
							
          delay_us(1);			
						
				  SPI_Cmd(SPI1, DISABLE);

0x0010就是spi的cs引脚。

下面是我的测得波形,黄色为时钟clk,绿色为输出sdo。基准我接的2.5v,输出数据0x7xxx,因为我输入电压就是1.25v左右,所以接收到的数据是对的。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值