OpenEdv-开源电子网

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

关于STM32F051/31的SPI的读写一个字节的程序的疑问

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-11-2
在线时间
0 小时
发表于 2015-11-2 11:41:24 | 显示全部楼层 |阅读模式
5金钱
最近在用STM32F031调试SPI,之前用STM32F103调试的时候还可以读到数据,也可以写数据,现在将程序移植到STM32F031上面,发现无法对数据进行读取,想请论坛里面的高手帮忙看下,我也搜了很多资料,说STM32F0的SPI和103的SPI配置有不一样的地方,是因为STM32F0多了FIFO,需要将FIFO配置成8位的,所以初始化的地方我已经改了,但是读写一个字节也是不一样的,求原子哥能否给一个STM32F0的SPI的例程(寄存器版本的)
我的配置是这样的:
[mw_shl_code=c,true]void SPI_InitConfigure(void) // 串行外设接口(SPI)初始化函数 { /* SPI1复位 ---------------------------------------------------------------------------------------------*/ // RCC->APB2RSTR |= RCC_APB2RSTR_SPI1RST; // 将 RCC_APB2RSTR 的第 12 位置 1 // RCC->APB2RSTR &= ~RCC_APB2RSTR_SPI1RST; // SPI1停止复位 /* SPI1时钟使能 -----------------------------------------------------------------------------------------*/ RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // SPI1时钟使能 /* SPI1 配置波特率控制 (Baud rate control) fPCLK/16 -----------------------------------------------------*/ SPI1->CR1 |= (0x06<<3); // fPCLK/128=375K /* SPI1 配置成空闲状态时,SCK保持高电平 -------------------------------------------------------------------*/ SPI1->CR1 |= SPI_CR1_CPOL; // 将 SPI1_CR1 的第 1 位置 1 /* SPI1 配置成数据采样从第二个时间边沿开始,CPHA=1 ---------------------------------------------------------*/ SPI1->CR1 |= SPI_CR1_CPHA; // 将 SPI1_CR1 的第 0 位置 1 /* SPI1 配置成全双工模式 ----------------------------------------------------------------------------------*/ SPI1->CR1 &= ~SPI_CR1_RXONLY; // 将 SPI1_CR1 的第 10 位清零 /* SPI1 配置2线的单向数据模式------------------------------------------------------------------------------*/ SPI1->CR1 &= ~SPI_CR1_BIDIMODE; /* SPI1 数据位为8位----------------------------------------------------------------------------------------*/ SPI1->CR2 |= (0x07<<7); // 配置数据位为8位数据 /* SPI1 配置帧格式 (Frame format) 0:先发送 MSB ----------------------------------------------------------*/ SPI1->CR1 &= ~SPI_CR1_LSBFIRST; // 将 SPI1_CR1 的第 7 位清零 /* SPI1 配置成启用软件从设备管理 --------------------------------------------------------------------------*/ SPI1->CR1 |= SPI_CR1_SSM; // 将 SPI1_CR1 的第 9 位置 1 /* SPI1 内部从设备选择 ------------------------------------------------------------------------------------*/ SPI1->CR1 |= SPI_CR1_SSI; // 将 SPI1_CR1 的第 8 位置 1 /* SPI1 FRXTH位的配置--------------------------------------------------------------------------------------*/ SPI1->CR2 |= SPI_CR2_FRXTH; //FIFO的设置 /* SPI1 配置为主设备 --------------------------------------------------------------------------------------*/ SPI1->CR1 |= SPI_CR1_MSTR; // 将 SPI1_CR1 的第 2 位置 1 /* SPI1 配置成使用8位数据帧格式进行发送/接收 --------------------------------------------------------------*/ // SPI1->CR1 &= ~(0x01<<11); // 将 SPI1_CR1 的第 11 位清 0 /* SPI1 开启SPI设备 ---------------------------------------------------------------------------------------*/ SPI1->CR1 |= SPI_CR1_SPE; // 将 SPI1_CR1 的第 6 位置 1 }[/mw_shl_code]
我的SPI读写一个字节的程序
u8 SPI_ReadWriteByte(SPI_TypeDef* SPIx,u8 TxData)
[mw_shl_code=c,true]{ u16 retry=0; u32 spixbase = 0x00; while((SPI1->SR && SPI_SR_TXE)==0) // 等待发送区空 { retry++; if(retry>0XFFFE) return 0; } /* Check the parameters */ // assert_param(IS_SPI_ALL_PERIPH(SPIx)); spixbase = (uint32_t)SPIx; spixbase += 0x0C; *(__IO uint8_t *) spixbase = TxData; retry = 0; while((SPI1->SR && SPI_SR_RXNE)==0) // 等待接收完一个 byte { retry++; if(retry>0XFFFE) return 0; } spixbase = (uint32_t)SPIx; spixbase += 0x0C; return *(__IO uint8_t *) spixbase; }[/mw_shl_code]
感觉初始化配置是没有问题的,用SPI读写一个字节的程序是有问题的,但是我不知道怎么去写,希望有高手指点下,或者给个例程给我,在线等 谢谢

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

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-11-2 13:06:50 | 显示全部楼层
直接用库函数即可,简单易用
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-11-2
在线时间
0 小时
 楼主| 发表于 2015-11-2 13:21:13 | 显示全部楼层
回复【2楼】八度空间:
---------------------------------
有寄存器版本的例程吗?求发送一份呢,邮箱:785583421@qq.com
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-11-2 17:21:31 | 显示全部楼层
回复【3楼】m_malan:
---------------------------------
没用过这芯片
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 16:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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