用spi1读写ads1256,对ads1256读写寄存器的值不同,可能是我设置的有问题或者是时序不对,也可能是spi设置不正确
希望原子哥或者坛子里的大神帮我看一下
弄了两天了 实在找不出问题 另外DRDY引脚输出30k方波
[mw_shl_code=c,true] #ifndef __ADS1256_H_
#define __ADS1256_H_
#include "sys.h"
//***************************
// Pin assign
// GPIOC10 --- RESET
// GPIOC11 --- DRDY
// GPIOB12 --- CS
// GPIOB13 --- SCK
// GPIOB14 --- DOUT
// GPIOB15 --- DIN
//***************************
/*?????¨??*/
#define RCC_ADS1256Reset RCC_APB2Periph_GPIOC
#define GPIO_RCC_ADS1256Reset_PORT GPIOC
#define GPIO_RCC_ADS1256Reset GPIO_Pin_10
#define RCC_ADS1256DRDY RCC_APB2Periph_GPIOC
#define GPIO_ADS1256DRDY_PORT GPIOC
#define GPIO_ADS1256DRDY GPIO_Pin_11
// define commands
#define ADS1256_CMD_WAKEUP 0x00
#define ADS1256_CMD_RDATA 0x01
#define ADS1256_CMD_RDATAC 0x03
#define ADS1256_CMD_SDATAC 0x0f
#define ADS1256_CMD_RREG 0x10
#define ADS1256_CMD_WREG 0x50
#define ADS1256_CMD_SELFCAL 0xf0
#define ADS1256_CMD_SELFOCAL 0xf1
#define ADS1256_CMD_SELFGCAL 0xf2
#define ADS1256_CMD_SYSOCAL 0xf3
#define ADS1256_CMD_SYSGCAL 0xf4
#define ADS1256_CMD_SYNC 0xfc
#define ADS1256_CMD_STANDBY 0xfd
#define ADS1256_CMD_REST 0xfe
// define the ADS1256 register values
#define ADS1256_STATUS 0x00
#define ADS1256_MUX 0x01
#define ADS1256_ADCON 0x02
#define ADS1256_DRATE 0x03
#define ADS1256_IO 0x04
#define ADS1256_OFC0 0x05
#define ADS1256_OFC1 0x06
#define ADS1256_OFC2 0x07
#define ADS1256_FSC0 0x08
#define ADS1256_FSC1 0x09
#define ADS1256_FSC2 0x0A
// define multiplexer codes
#define ADS1256_MUXP_AIN0 0x00
#define ADS1256_MUXP_AIN1 0x10
#define ADS1256_MUXP_AIN2 0x20
#define ADS1256_MUXP_AIN3 0x30
#define ADS1256_MUXP_AIN4 0x40
#define ADS1256_MUXP_AIN5 0x50
#define ADS1256_MUXP_AIN6 0x60
#define ADS1256_MUXP_AIN7 0x70
#define ADS1256_MUXP_AINCOM 0x80
#define ADS1256_MUXN_AIN0 0x00
#define ADS1256_MUXN_AIN1 0x01
#define ADS1256_MUXN_AIN2 0x02
#define ADS1256_MUXN_AIN3 0x03
#define ADS1256_MUXN_AIN4 0x04
#define ADS1256_MUXN_AIN5 0x05
#define ADS1256_MUXN_AIN6 0x06
#define ADS1256_MUXN_AIN7 0x07
#define ADS1256_MUXN_AINCOM 0x08
// define gain codes
#define ADS1256_GAIN_1 0x00
#define ADS1256_GAIN_2 0x01
#define ADS1256_GAIN_4 0x02
#define ADS1256_GAIN_8 0x03
#define ADS1256_GAIN_16 0x04
#define ADS1256_GAIN_32 0x05
#define ADS1256_GAIN_64 0x06
//#define ADS1256_GAIN_64 0x07
//define drate codes
#define ADS1256_DRATE_30000SPS 0xF0
#define ADS1256_DRATE_15000SPS 0xE0
#define ADS1256_DRATE_7500SPS 0xD0
#define ADS1256_DRATE_3750SPS 0xC0
#define ADS1256_DRATE_2000SPS 0xB0
#define ADS1256_DRATE_1000SPS 0xA1
#define ADS1256_DRATE_500SPS 0x92
#define ADS1256_DRATE_100SPS 0x82
#define ADS1256_DRATE_60SPS 0x72
#define ADS1256_DRATE_50SPS 0x63
#define ADS1256_DRATE_30SPS 0x53
#define ADS1256_DRATE_25SPS 0x43
#define ADS1256_DRATE_15SPS 0x33
#define ADS1256_DRATE_10SPS 0x23
#define ADS1256_DRATE_5SPS 0x13
#define ADS1256_DRATE_2_5SPS 0x03
extern unsigned int sum;
unsigned int ADS1256ReadData(u8 chan);
void ADS1256_Init(void); //??????ADS1256
void Init_ADS1256_GPIO(void);
void Delay(unsigned int dal);
unsigned int ADS_sum(unsigned char channel);
u8 SPI1_ReadWriteByte(u8 TxData);//SPI×???????????×???
void SPI1_SetSpeed(u8 SpeedSet); //?è??SPI????
u8 SPI1_ReadByte(void);
u8 ads1256_check(void);
#endif
#include <stdio.h>
#include "stm32f10x_gpio.h"
#include "ADS1256.h"
#include "spi.h"
#include "delay.h"
unsigned int sum=0;
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //PA5.6.7????
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //?è??SPI???ò?ò?????ò??????????:SPI?è???????????ò?????¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //?è??SPI?¤×÷????:?è?????÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //?è??SPI???????ó??:SPI·???????8?????á??
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //???????®???±????????:?±???ü????
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; //?¨???¨?????¤·???????:?¨?????¤·???????16
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_SetSpeed(SPI_BaudRatePrescaler_4);
SPI1_ReadWriteByte(0xff);//????????
}
//??????ADS1256 GPIO
void Init_ADS1256_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_ADS1256Reset | RCC_ADS1256DRDY, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_RCC_ADS1256Reset;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_RCC_ADS1256Reset_PORT, &GPIO_InitStructure);
GPIO_ResetBits(GPIO_RCC_ADS1256Reset_PORT, GPIO_RCC_ADS1256Reset );
GPIO_InitStructure.GPIO_Pin = GPIO_ADS1256DRDY;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_ADS1256DRDY_PORT, &GPIO_InitStructure);
SPI1_Init();
}
//-----------------------------------------------------------------//
// ?? ????ADS1256 ??????
// ????????: /
// ????????: /
// ????±???: /
// ±? ×?: ?òADS1256?????·??regaddr???????÷????????×???databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
while(!(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)));
SPI1_ReadWriteByte(regaddr+0x50);
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(databyte);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
u8 ADS1256RREG(unsigned char regaddr)
{u8 re=0XFF;
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
while(!(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)));//?±ADS1256_DRDY?????±???????????÷
SPI1_ReadWriteByte(regaddr+ADS1256_CMD_RREG);
SPI1_ReadWriteByte(0x00);
re=SPI1_ReadByte();
GPIO_SetBits(GPIOA, GPIO_Pin_4);
return re;
}
u8 ads1256_check(void)
{
// ADS1256WREG(ADS1256_STATUS,0x06);
if(ADS1256RREG(ADS1256_STATUS)==0x06)return 0;
else return 1;
}
//??????ADS1256
void ADS1256_Init(void)
{u8 r=0;
ADS1256WREG(ADS1256_STATUS,0x06); // ???????°????×???????????
ADS1256WREG(ADS1256_MUX,0x18); // ??????????A0???®+????AINCOM???®-??
ADS1256WREG(ADS1256_ADCON,0x20); // ·??ó±???1
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_50SPS); // ????5sps
ADS1256WREG(ADS1256_IO,0x00);
SPI1_ReadWriteByte(ADS1256_CMD_SELFCAL);
delay_ms(50);
}
//????AD??
unsigned int ADS1256ReadData(u8 chan)
{
unsigned char i=0;
// unsigned int sum=0;
unsigned int r=0;
u8 a1,a2,a3;
GPIO_ResetBits(GPIOA, GPIO_Pin_4);;
while(!(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY))); //?±ADS1256_DRDY?????±???????????÷
ADS1256WREG(ADS1256_MUX,chan); //?è???¨??
SPI1_ReadWriteByte(ADS1256_CMD_SYNC);
SPI1_ReadWriteByte(ADS1256_CMD_WAKEUP);
SPI1_ReadWriteByte(ADS1256_CMD_RDATA);
sum |= (SPI1_ReadWriteByte(0xff) << 16);
sum |= (SPI1_ReadWriteByte(0xff) << 8);
sum |= SPI1_ReadWriteByte(0xff);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
delay_us(100);
return sum;
}
//-----------------------------------------------------------------//
// ?? ????????ADS1256???·????
// ????????: /
// ????????: /
// ????±???: /
// ±? ×?: /
//-----------------------------------------------------------------//
unsigned int ADS_sum(unsigned char channel)
{
//ADS1256WREG(ADS1256_MUX,channel); //?è???¨??
return ADS1256ReadData(channel);//????AD????·???24????????
// ADS1256ReadData(buf);
}
void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SPI_BaudRatePrescaler;
SPI_Cmd(SPI1,ENABLE);
}
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI1, TxData); //?¨?????èSPIx·???????????
retry=0;
}
u8 SPI1_ReadByte(void)
{u8 retry;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1);
}[/mw_shl_code]
|