完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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的寄存器,读不出来寄存器的值,各位大神帮忙看看哪儿出问题了!这应该是个小问题,但对目前的我来说还是有困难的。谢谢了! |
|
相关推荐
9个回答
|
|
原子哥,你有时间帮我看一下是哪个地方漏过了还是怎么了,刚开始学stm32,很多地方不太懂,自己来做就是整体思路能通,细节上就不行了!
|
|
|
|
先看看SPI有没有波形吧
|
|
|
|
有波形,但读寄存器时值一直是0,是不是硬件焊接的问题啊!
|
|
|
|
慢慢查吧。
|
|
|
|
嗯!好吧,现在正查硬件问题呢!
|
|
|
|
原子哥,我现在想把u***鼠标例程和通过spi读取mpu的例程合并到一块,实现mpu通过中断向stm32发送数据,stm32 经过处理后再通过u***向上位机发送数据。这两个例程单独编译都没有啥大问题,合并到一块后mpu的中断进不了,后来就直接不通过中断直接读取,hushound有时能正常显示发送的值,有时不在下面打印,但是有时把u***插拔几次就又可以继续读取了。这是不是初始化的时候有什么问题啊?我觉得应该是读取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 } |
|
|
|
数据读不出的问题找到了,是硬件的问题,没焊接好,又请别人焊接的。同时也谢谢原子哥了,这么忙还给我解答问题。
|
|
|
|
原子哥,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最近接收的数据 } |
|
|
|
我刚才又试了一下好像这样写就可以同时进行数据读取了!这是为啥呢?我把 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(); } |
|
|
|
只有小组成员才能发言,加入小组>>
请问下图大疆lightbridge2遥控器主板电源芯片型号是什么?
4477 浏览 1 评论
使用常见的二极管、三极管和mos做MCU和模组的电平转换电路,但是模组和MCU无法正常通信,为什么?
347浏览 2评论
为了提高USIM卡电路的可靠性和稳定性,在电路设计中须注意的点有哪些?
353浏览 2评论
380浏览 2评论
370浏览 2评论
421浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 23:06 , Processed in 1.077562 second(s), Total 94, Slave 78 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号