OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2180|回复: 4

操作ADS129x,SPI读取寄存器总是乱码

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-5-4
在线时间
5 小时
发表于 2016-12-15 11:01:50 | 显示全部楼层 |阅读模式
3金钱
用的407的开发板,AD用的是TI的ADS1299的评估板,SPI都设置好的了,但是每次读寄存器数据都是失败。
源码如下:
#include "ADS1299.h"

/*SPI ReadWriteByte*/
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{
uint8_t RxData;
int count;
HAL_SPI_Transmit(&hspi1,&TxData,1,10);
HAL_SPI_Receive(&hspi1,&RxData,1,10);
//HAL_SPI_TransmitReceive(&hspi1,&TxData,&RxData,1,1000);
return RxData;
}
/*SPI Write registers*/
void ADS1299_WriteReg(uint8_t RegAddr,uint8_t RegData)
{
uint8_t WriteAddr;
int count;

ADS1299_CS_Low;
WriteAddr=WREG|RegAddr;
SPI1_ReadWriteByte(WriteAddr);
for(count=0;count<168;count++);
SPI1_ReadWriteByte(0x00);
for(count=0;count<168;count++);
SPI1_ReadWriteByte(RegData);
for(count=0;count<168;count++);
ADS1299_CS_High;
}
/*SPI Read registers*/
uint8_t ADS1299_ReadReg(uint8_t RegAddr)
{
uint8_t ReadAddr;
uint8_t ReadData;
int count;

ADS1299_CS_Low;
ReadAddr=RREG|RegAddr;
SPI1_ReadWriteByte(ReadAddr);
for(count=0;count<168;count++);
SPI1_ReadWriteByte(0x00);
for(count=0;count<168;count++);
ReadData=SPI1_ReadWriteByte(0xff);
for(count=0;count<168;count++);
ADS1299_CS_High;
return ReadData;
}
/*SPI Write command*/
void ADS1299_WriteCommand(uint8_t Command)
{
ADS1299_CS_Low;
SPI1_ReadWriteByte(Command);
ADS1299_CS_High;
}
/*ADS1299 Read ADC data*/
uint8_t ADS1299_ReadAdcData(uint8_t *AdcData)
{
uint8_t i=0;
ADS1299_CS_Low;
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)!=SET);
for(i=0;i<27;i++)
{
  AdcData[i]=SPI1_ReadWriteByte(0xff);
}
ADS1299_CS_High;
return SUCCESS;
}
/*ADS1299 Initial floww at Power-Up*/
void ADS1299_PowerUpInit(void)
{
uint8_t RegValue;
// Delay for Power-On Reset and Oscillator Start-Up;
ADS1299_PDWN_High;
ADS1299_RESET_High;
ADS1299_START_Low;
HAL_Delay(1000);//Delay 1s
//Issue Reset Pulse
ADS1299_RESET_Low;
HAL_Delay(100);//Delay 100ms
ADS1299_RESET_High;
HAL_Delay(100);//Delay 100ms
//Send SDATAC Command
ADS1299_WriteCommand(SDATAC);
//Set Reference
ADS1299_WriteReg(ADS1299_REG_CONFIG3,0xE0);//Using internal Reference
HAL_Delay(10);//Delay 10ms

RegValue=ADS1299_ReadReg(ADS1299_REG_CONFIG3);//Debug !!!
printf("CONFIG3 :%04X\r\n",RegValue);
//Write certain Registers
ADS1299_WriteReg(ADS1299_REG_CONFIG1,0x96);//Set output data rate =fMOD/4096(250 SPS)
ADS1299_WriteReg(ADS1299_REG_CONFIG2,0xC0);//Set test signal are generated internally and signal amplitude
                       //is 1x-(VREFP-VREFN)/2400, the frequency is fCLK/2^21
RegValue=ADS1299_ReadReg(ADS1299_REG_CONFIG1);//Debug !!!
printf("CONFIG1 :%04X\r\n",RegValue);
RegValue=ADS1299_ReadReg(ADS1299_REG_CONFIG2);//Debug !!!
printf("CONFIG2 :%04X\r\n",RegValue);

ADS1299_WriteReg(ADS1299_REG_CH1SET,0x01);//Set All channels to input short
ADS1299_WriteReg(ADS1299_REG_CH2SET,0x01);
ADS1299_WriteReg(ADS1299_REG_CH3SET,0x01);
ADS1299_WriteReg(ADS1299_REG_CH4SET,0x01);
ADS1299_WriteReg(ADS1299_REG_CH5SET,0x01);
ADS1299_WriteReg(ADS1299_REG_CH6SET,0x01);
ADS1299_WriteReg(ADS1299_REG_CH7SET,0x01);
ADS1299_WriteReg(ADS1299_REG_CH8SET,0x01);

RegValue=ADS1299_ReadReg(ADS1299_REG_CH1SET);//Debug !!!
printf("CH1SET :%04X\r\n",RegValue);
RegValue=ADS1299_ReadReg(ADS1299_REG_CH2SET);//Debug !!!
printf("CH2SET :%04X\r\n",RegValue);
RegValue=ADS1299_ReadReg(ADS1299_REG_CH3SET);//Debug !!!
printf("CH3SET :%04X\r\n",RegValue);
RegValue=ADS1299_ReadReg(ADS1299_REG_CH4SET);//Debug !!!
printf("CH4SET :%04X\r\n",RegValue);
RegValue=ADS1299_ReadReg(ADS1299_REG_CH5SET);//Debug !!!
printf("CH5SET :%04X\r\n",RegValue);
RegValue=ADS1299_ReadReg(ADS1299_REG_CH6SET);//Debug !!!
printf("CH6SET :%04X\r\n",RegValue);
RegValue=ADS1299_ReadReg(ADS1299_REG_CH7SET);//Debug !!!
printf("CH7SET :%04X\r\n",RegValue);
RegValue=ADS1299_ReadReg(ADS1299_REG_CH8SET);//Debug !!!
printf("CH8SET :%04X\r\n",RegValue);

//Active Conversion
ADS1299_START_High;//Set START=1
//Put the device back in RDATAC mode
ADS1299_WriteCommand(RDATAC);
}
















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-5-4
在线时间
5 小时
 楼主| 发表于 2016-12-15 11:05:20 | 显示全部楼层
/**
  ******************************************************************************
  * File Name          : SPI.c
  * Description        : This file provides code for the configuration
  *                      of the SPI instances.
  ******************************************************************************
  *
  * Copyright (c) 2016 STMicroelectronics International N.V.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted, provided that the following conditions are met:
  *
  * 1. Redistribution of source code must retain the above copyright notice,
  *    this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
  *    this list of conditions and the following disclaimer in the documentation
  *    and/or other materials provided with the distribution.
  * 3. Neither the name of STMicroelectronics nor the names of other
  *    contributors to this software may be used to endorse or promote products
  *    derived from this software without specific written permission.
  * 4. This software, including modifications and/or derivative works of this
  *    software, must execute solely and exclusively on microcontroller or
  *    microprocessor devices manufactured by or for STMicroelectronics.
  * 5. Redistribution and use of this software other than as permitted under
  *    this license is void and will automatically terminate your rights under
  *    this license.
  *
  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "spi.h"

#include "gpio.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

SPI_HandleTypeDef hspi1;

/* SPI1 init function */
void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();
  
    /**SPI1 GPIO Configuration   
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN SPI1_MspInit 1 */

  /* USER CODE END SPI1_MspInit 1 */
  }
}

void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{

  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspDeInit 0 */

  /* USER CODE END SPI1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_SPI1_CLK_DISABLE();
  
    /**SPI1 GPIO Configuration   
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);

  }
  /* USER CODE BEGIN SPI1_MspDeInit 1 */

  /* USER CODE END SPI1_MspDeInit 1 */
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-12-17 21:06:11 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-5-4
在线时间
5 小时
 楼主| 发表于 2016-12-19 09:23:29 | 显示全部楼层

哎,可能是用Cube MX生成的初始化代码,我用寄存器初始化了一遍,能用
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-6-19
在线时间
3 小时
发表于 2020-6-19 19:43:32 | 显示全部楼层
您好,请问用寄存器初始化的代码能发一下吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-1 08:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表