[STM32F1] STM32驱动外接ADC芯片ADS1120问题

[复制链接]
9324|6
 楼主| zoyee.l 发表于 2015-3-27 16:33 | 显示全部楼层 |阅读模式
使用STM32F103C8T6的SPI驱动ADS1120芯片,内部有四个寄存器,由STM32发送数据拿示波器看了,没问题,就是接收有问题,我写了一个读寄存器命令,将写进ADS1120的四个寄存器读出来检验是否正确,但读出来的都是0xFF,调了一个星期实在找不到问题所在,上来请教请教各位老师。数据通过485发送到电脑上看,UART配置那块程序我就没粘上去了。这是他的命令码与伪代码,我是按照伪代码去编写的程序,但是在读取之前写进去的寄存器数据发现出来的都是0xFF,不知道是没写进去还是说读错了。
command.jpg
weidaima.jpg

  1. #include "stm32f10x.h"
  2. #define ADC_CS_LOW  GPIO_ResetBits(GPIOA,GPIO_Pin_4);
  3. #define ADC_CS_HIGN  GPIO_SetBits(GPIOA,GPIO_Pin_4);
  4. void UART2Init(void);
  5. void UART2_PutChar(u8 ch);
  6. void Delay_N_ms(unsigned int n);
  7. void SPI_Configuration();
  8. void ADC_RESET();
  9. void SPI1_SendByte(u8 byte);
  10. unsigned char SPI1_ReadByte(u8 byte);



  11. unsigned char temp,ADC_HIGN_DATA,ADC_LOW_DATA;
  12. u16 ADC_Data;

  13. int main(void)
  14. {
  15.   SystemInit();
  16.   UART2Init();
  17.   SPI_Configuration();
  18.   ADC_RESET();
  19.    
  20.   while (1)
  21.   {

  22.   }
  23. }

  24. void SPI_Configuration()
  25. {
  26.     GPIO_InitTypeDef GPIO_InitStructure;
  27.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);
  28.     //SPI_NSS 推挽输出
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  31.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  32.     GPIO_Init(GPIOA,&GPIO_InitStructure);
  33.     //SPI_MISO 浮空输入
  34.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  35.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  37.     GPIO_Init(GPIOA,&GPIO_InitStructure);
  38.     //SPI_MOSI | SPI_SCK复用推挽输出
  39.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
  40.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  41.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42.     GPIO_Init(GPIOA,&GPIO_InitStructure);
  43.     //AD_READY信号
  44.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  45.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  46.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47.     GPIO_Init(GPIOB,&GPIO_InitStructure);
  48.    
  49.    
  50.   
  51.     SPI_InitTypeDef  SPI_InitStructure;
  52.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 , ENABLE);
  53.     SPI_Cmd(SPI1, DISABLE); //先禁止才能改变Mode
  54.     SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; //双线双向全双工
  55.     SPI_InitStructure.SPI_Mode =SPI_Mode_Master;//设置为主SPI
  56.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位数据帧格式
  57.     SPI_InitStructure.SPI_CPOL =SPI_CPOL_Low;//SCK引脚在空闲状态保持低电平
  58.     SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
  59.     SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;//软件控制NSS信号
  60.     SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_8;//比特率预分频值为8
  61.     SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;//数据从高位开始发送
  62.     SPI_InitStructure.SPI_CRCPolynomial =7;//定义用于计算CRC的多项式
  63.     SPI_Init(SPI1,&SPI_InitStructure);
  64.     SPI_Cmd(SPI1, ENABLE);
  65.     ADC_CS_HIGN;
  66. }




  67. void ADC_RESET()
  68. {
  69.     Delay_N_ms(1);//延时
  70.     ADC_CS_LOW;//选中ADC芯片
  71.     Delay_N_ms(1);//延时
  72.     SPI1_SendByte(0x06);//复位ADC
  73.     Delay_N_ms(1);//延时
  74.     SPI1_SendByte(0x43);//0x43--01000011,写四个寄存器,从00-11开始写
  75.     SPI1_SendByte(0x91);//00寄存器----AIN1为模拟输入管脚,无增益,PGA失能
  76.     SPI1_SendByte(0xc0);//01寄存器----数据传输率1000SPS,单次转换模式
  77.     SPI1_SendByte(0x00);//10寄存器----内部2.048V参考源
  78.     SPI1_SendByte(0x00);//11寄存器----DRAY提示转换结束
  79.     SPI1_SendByte(0x23);//读寄存器,查看是否正确
  80.     Delay_N_ms(1);//延时
  81.     UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器00
  82.     UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器01
  83.     UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器10
  84.     UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器11
  85.     SPI1_SendByte(0x08);//打开ADC转换使能,开始ADC转换
  86.     Delay_N_ms(1);//延时
  87.     ADC_CS_HIGN;
  88.   
  89. }


  90. void SPI1_SendByte(u8 byte)
  91. {
  92.     while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
  93.     SPI_I2S_SendData(SPI1,byte);
  94.     while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
  95.     SPI_I2S_ReceiveData(SPI1);
  96. }


  97. unsigned char SPI1_ReadByte(u8 byte)
  98. {
  99.     while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
  100.     SPI_I2S_SendData(SPI1,byte);
  101.     while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
  102.     return SPI_I2S_ReceiveData(SPI1);
  103. }





vigous1 发表于 2015-3-29 23:20 | 显示全部楼层

STM32外部需要匹配32.768KHZ 6PF晶体。楼上说的有道理
huangtianbao 发表于 2017-3-23 14:16 | 显示全部楼层
楼主你好!请问这个问题最终是怎么解决的,我现在也遇到这个问题了,,
zmh0 发表于 2017-4-5 22:43 | 显示全部楼层
楼主这个问题最后怎么解决的,能否赐教一二,感激不尽!!!
zmh0 发表于 2017-4-6 21:43 | 显示全部楼层
今天终于找到问题了,在这里贴出来供后来人参考:我的ADS1120接+5V的引脚中间加了一个0欧姆的电阻,然后这个电阻没给焊上去,所以导致ADS1120芯片根本没工作。。。其实遇到这种情况,可以转换一个角度,把ADS1120芯片作为主角,给它提供正确的CS、SCK、MOSI信号,看它有没有正常工作,如果没有就可能是硬件上的问题了。
jqqqqq 发表于 2017-5-31 10:45 | 显示全部楼层
楼主能提供下完整的代码吗?让大家少走些弯路
rui9527 发表于 2019-6-25 08:34 | 显示全部楼层
请问楼主,最后是发什么问题,本人遇到类似的问题,用示波器看到读出来的数据是有问题的!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

205

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部