OpenEdv-开源电子网

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

使用SPI1读写ADS1256

[复制链接]

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-10-24
在线时间
4 小时
发表于 2015-6-14 18:26:46 | 显示全部楼层 |阅读模式
5金钱
用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]

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

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-10-24
在线时间
4 小时
 楼主| 发表于 2015-6-14 18:31:56 | 显示全部楼层
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11521
金钱
11521
注册时间
2014-4-1
在线时间
1310 小时
发表于 2015-6-14 20:23:01 | 显示全部楼层
这件事,需要同时了解 CPU 和 ADS1256。估计很难有人答你。

上示波器吧,重点看 sck 和 mosi 。
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-10-24
在线时间
4 小时
 楼主| 发表于 2015-6-15 13:10:16 | 显示全部楼层
回复【3楼】xuande:
---------------------------
好的老师,还想请教你一下
这个战舰SPI函数:
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); 
retry=0;

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) 
{
retry++;
if(retry>200)return 0;
}        
return SPI_I2S_ReceiveData(SPI1);      
}

SPI发送数据的时候好理解,那如果接收数据的时候用这个函数也可以吗?
我看例程里面是这么写的    re=SPI1_ReadWriteByte(0xFF);
这样的接收函数  不会把0XFF发送出去吗?
希望原子哥或者老师您帮我解答一下
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11521
金钱
11521
注册时间
2014-4-1
在线时间
1310 小时
发表于 2015-6-15 13:58:28 | 显示全部楼层
回复【4楼】嗯啊:
---------------------------------

SPI, 发送和接收共用 sck,所以是同时完成的。看看时序波形就知道。

这样当然会把 0xFF 发出去,

然后呢?想一想。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-11-21
在线时间
9 小时
发表于 2021-4-26 10:03:14 | 显示全部楼层
有解决的 嘛
回复

使用道具 举报

18

主题

50

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1881
金钱
1881
注册时间
2017-10-8
在线时间
228 小时
发表于 2023-10-4 10:49:15 | 显示全部楼层
是不是因为SPI1挂载在高速时钟线上锝缘故呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 20:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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