打印
[STM32F1]

STM32驱动外接ADC芯片ADS1120问题

[复制链接]
8495|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zoyee.l|  楼主 | 2015-3-27 16:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用STM32F103C8T6的SPI驱动ADS1120芯片,内部有四个寄存器,由STM32发送数据拿示波器看了,没问题,就是接收有问题,我写了一个读寄存器命令,将写进ADS1120的四个寄存器读出来检验是否正确,但读出来的都是0xFF,调了一个星期实在找不到问题所在,上来请教请教各位老师。数据通过485发送到电脑上看,UART配置那块程序我就没粘上去了。这是他的命令码与伪代码,我是按照伪代码去编写的程序,但是在读取之前写进去的寄存器数据发现出来的都是0xFF,不知道是没写进去还是说读错了。



#include "stm32f10x.h"
#define ADC_CS_LOW  GPIO_ResetBits(GPIOA,GPIO_Pin_4);
#define ADC_CS_HIGN  GPIO_SetBits(GPIOA,GPIO_Pin_4);
void UART2Init(void);
void UART2_PutChar(u8 ch);
void Delay_N_ms(unsigned int n);
void SPI_Configuration();
void ADC_RESET();
void SPI1_SendByte(u8 byte);
unsigned char SPI1_ReadByte(u8 byte);



unsigned char temp,ADC_HIGN_DATA,ADC_LOW_DATA;
u16 ADC_Data;

int main(void)
{
  SystemInit();
  UART2Init();
  SPI_Configuration();
  ADC_RESET();
   
  while (1)
  {

  }
}

void SPI_Configuration()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);
    //SPI_NSS 推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    //SPI_MISO 浮空输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    //SPI_MOSI | SPI_SCK复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    //AD_READY信号
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
   
   
  
    SPI_InitTypeDef  SPI_InitStructure;
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 , ENABLE);
    SPI_Cmd(SPI1, DISABLE); //先禁止才能改变Mode
    SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; //双线双向全双工
    SPI_InitStructure.SPI_Mode =SPI_Mode_Master;//设置为主SPI
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位数据帧格式
    SPI_InitStructure.SPI_CPOL =SPI_CPOL_Low;//SCK引脚在空闲状态保持低电平
    SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
    SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;//软件控制NSS信号
    SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_8;//比特率预分频值为8
    SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;//数据从高位开始发送
    SPI_InitStructure.SPI_CRCPolynomial =7;//定义用于计算CRC的多项式
    SPI_Init(SPI1,&SPI_InitStructure);
    SPI_Cmd(SPI1, ENABLE);
    ADC_CS_HIGN;
}




void ADC_RESET()
{
    Delay_N_ms(1);//延时
    ADC_CS_LOW;//选中ADC芯片
    Delay_N_ms(1);//延时
    SPI1_SendByte(0x06);//复位ADC
    Delay_N_ms(1);//延时
    SPI1_SendByte(0x43);//0x43--01000011,写四个寄存器,从00-11开始写
    SPI1_SendByte(0x91);//00寄存器----AIN1为模拟输入管脚,无增益,PGA失能
    SPI1_SendByte(0xc0);//01寄存器----数据传输率1000SPS,单次转换模式
    SPI1_SendByte(0x00);//10寄存器----内部2.048V参考源
    SPI1_SendByte(0x00);//11寄存器----DRAY提示转换结束
    SPI1_SendByte(0x23);//读寄存器,查看是否正确
    Delay_N_ms(1);//延时
    UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器00
    UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器01
    UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器10
    UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器11
    SPI1_SendByte(0x08);//打开ADC转换使能,开始ADC转换
    Delay_N_ms(1);//延时
    ADC_CS_HIGN;
  
}


void SPI1_SendByte(u8 byte)
{
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,byte);
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
    SPI_I2S_ReceiveData(SPI1);
}


unsigned char SPI1_ReadByte(u8 byte)
{
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,byte);
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
    return SPI_I2S_ReceiveData(SPI1);
}





沙发
vigous1| | 2015-3-29 23:20 | 只看该作者

STM32外部需要匹配32.768KHZ 6PF晶体。楼上说的有道理

使用特权

评论回复
板凳
huangtianbao| | 2017-3-23 14:16 | 只看该作者
楼主你好!请问这个问题最终是怎么解决的,我现在也遇到这个问题了,,

使用特权

评论回复
地板
zmh0| | 2017-4-5 22:43 | 只看该作者
楼主这个问题最后怎么解决的,能否赐教一二,感激不尽!!!

使用特权

评论回复
5
zmh0| | 2017-4-6 21:43 | 只看该作者
今天终于找到问题了,在这里贴出来供后来人参考:我的ADS1120接+5V的引脚中间加了一个0欧姆的电阻,然后这个电阻没给焊上去,所以导致ADS1120芯片根本没工作。。。其实遇到这种情况,可以转换一个角度,把ADS1120芯片作为主角,给它提供正确的CS、SCK、MOSI信号,看它有没有正常工作,如果没有就可能是硬件上的问题了。

使用特权

评论回复
6
jqqqqq| | 2017-5-31 10:45 | 只看该作者
楼主能提供下完整的代码吗?让大家少走些弯路

使用特权

评论回复
7
rui9527| | 2019-6-25 08:34 | 只看该作者
请问楼主,最后是发什么问题,本人遇到类似的问题,用示波器看到读出来的数据是有问题的!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

205

帖子

2

粉丝