OpenEdv-开源电子网

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

stm32通过spi2读取不了数字传感器的寄存器,是哪个地方配置错误!

[复制链接]

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
发表于 2015-7-16 15:15:13 | 显示全部楼层 |阅读模式
5金钱
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI2速度 
SPI_Cmd(SPI1,ENABLE); 


  这是spi2的初始化,参照spi1改的。
void SPI2_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef SPI_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能 
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
 
  GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

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; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
SPI_Cmd(SPI2, ENABLE); //使能SPI外设

//SPI2_ReadWriteByte(0xff);//启动传输  
 
}   

  读寄存器
uint8_t hmc5983GetReg(uint8_t reg) {

uint8_t value;
uint8_t ReadAddr = 0x80 | reg;

SPI_HMC_CS=0;
   
SPI2_ReadWriteByte(ReadAddr);
value = SPI2_ReadWriteByte(0xFF);

delay_us(1);
SPI_HMC_CS=1;
return value;
}
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI2_ReadWriteByte(u8 TxData)

u8 retry=0; 
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}  
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据

retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}      
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据    
}
 //HMC5983的初始化
void hmc5983Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 
    
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //片选
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.12
GPIO_SetBits(GPIOB,GPIO_Pin_12);

    // wait for a valid response

    while ( hmc5983GetReg(0x0a) != 'H')   ////////////就是这儿出错,读不出寄存器的值。
delay_ms(10);
    hmc5983SetReg(0x00, 0x70);
    delay_ms(10); 
    hmc5983SetReg(0x01, 0x00);
    delay_ms(10);
    hmc5983SetReg(0x02, 0x00);
    delay_ms(10);
    Init_HMC5983_NVIC(); 


stm32 通过spi2读取hmc5983的寄存器,读不出来寄存器的值,各位大神帮忙看看哪儿出问题了!这应该是个小问题,但对目前的我来说还是有困难的。谢谢了!
没有什么可以阻挡!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
 楼主| 发表于 2015-7-16 19:46:55 | 显示全部楼层
有没有遇到过同样这种问题的?
没有什么可以阻挡!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-16 21:54:39 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
 楼主| 发表于 2015-7-17 10:04:32 | 显示全部楼层
原子哥,你有时间帮我看一下是哪个地方漏过了还是怎么了,刚开始学stm32,很多地方不太懂,自己来做就是整体思路能通,细节上就不行了!
没有什么可以阻挡!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-17 21:06:40 | 显示全部楼层
回复【4楼】eshsh:
---------------------------------
先看看SPI有没有波形吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
 楼主| 发表于 2015-7-21 16:14:27 | 显示全部楼层
有波形,但读寄存器时值一直是0,是不是硬件焊接的问题啊!
没有什么可以阻挡!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-21 22:46:33 | 显示全部楼层
回复【6楼】eshsh:
---------------------------------
慢慢查吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
 楼主| 发表于 2015-7-22 14:54:27 | 显示全部楼层
嗯!好吧,现在正查硬件问题呢!
没有什么可以阻挡!
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
 楼主| 发表于 2015-7-23 11:04:51 | 显示全部楼层
原子哥,我现在想把usb鼠标例程和通过spi读取mpu的例程合并到一块,实现mpu通过中断向stm32发送数据,stm32 经过处理后再通过usb向上位机发送数据。这两个例程单独编译都没有啥大问题,合并到一块后mpu的中断进不了,后来就直接不通过中断直接读取,hushound有时能正常显示发送的值,有时不在下面打印,但是有时把usb插拔几次就又可以继续读取了。这是不是初始化的时候有什么问题啊?我觉得应该是读取mpu的时候出的问题(因为我随便给个值的时候都可以正常发送,但读取mpu的时候为啥有时有,有时没有!),中断分组函数改为了一个,是不是还有其他的初始化有问题啊!现在不知道了!
int main(void)
{

        Set_System();
USB_Interrupts_Config();

Init_IMU();//xx这是初始化spi1和对mpu的初始化

        Set_USBClock(); 
USB_Init();

  while (1)
  {
#if 0                                  xx
Joystick_Send(6);              xx
Joystick_Send(10);            xx这些发送正常
Joystick_Send(500);          xx
#endif                                xx


#if 1                                                              xxx 下面的发送就开始有问题了!xxx
            if (bDeviceState == CONFIGURED)
            {
               //if ((JoyState() != 0) && (PrevXferComplete))
                    {
MPU6000_getRaw(&ax,&ay,&az,&gx,&gy,&gz);   //这是获取mpu值的函数

Joystick_Send(ax);
Joystick_Send(ay);
Joystick_Send(az);
Joystick_Send(gx);
Joystick_Send(gy);
Joystick_Send(gz);
}
                  }    
#endif 
            }
没有什么可以阻挡!
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
 楼主| 发表于 2015-7-23 14:43:47 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
数据读不出的问题找到了,是硬件的问题,没焊接好,又请别人焊接的。同时也谢谢原子哥了,这么忙还给我解答问题。
没有什么可以阻挡!
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
 楼主| 发表于 2015-7-23 17:59:05 | 显示全部楼层
原子哥,stm32同时使用spi1和spi2读取外设寄存器,初始化时有什么要注意的吗?spi2是通过spi1修改的,两个单独都能正常读取。合并到一块后是先初始化哪个,哪个可以读取。读取函数也分开了!怎么办!!
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}   
SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据

retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}        
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据     
}


u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}   
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据

retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}        
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据     
}
没有什么可以阻挡!
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-7-16
在线时间
0 小时
 楼主| 发表于 2015-7-23 18:19:07 | 显示全部楼层
我刚才又试了一下好像这样写就可以同时进行数据读取了!这是为啥呢?我把 Init_MPU6000()和hmc5983Init();写到一块就不行了!!  



这是先初始化spi1,并对spi1所连的外设MPU6000进行初始化,再初始化spi2和其所连的hmc5983.(这个可以同时读取6000和5983的值)
{
SPI1_Init();  //初始化SPI1
SPI1_SetSpeed(SPI_BaudRatePrescaler_4);    
Init_MPU6000();

SPI2_Init();  //初始化SPI2
SPI2_SetSpeed(SPI_BaudRatePrescaler_4);
hmc5983Init();  
}


下面这样写的话就会谁靠前,可以读谁,(比如下面的是6000可以读取)
{
SPI1_Init();  //初始化SPI1
SPI1_SetSpeed(SPI_BaudRatePrescaler_4);    
    
SPI2_Init();  //初始化SPI2
SPI2_SetSpeed(SPI_BaudRatePrescaler_4);
   
Init_MPU6000();
hmc5983Init();  
}
没有什么可以阻挡!
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-10-24
在线时间
15 小时
发表于 2019-5-16 22:41:41 | 显示全部楼层
您好。我这周尝试在用stm32f407vgt6的spi2总线驱动hmc5983。我现在的问题是读取它的IRA,IRB,IRC寄存器的值读到的是随机的,并不是这三个寄存器的默认值(0x48,0x34,0x33)。不知道您有没有时间线上指点我一下?调了好几天都调不出来,非常希望您能够指点我一下。万分感谢!我的qq:631525095.
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 22:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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