stm32103 spi主机不连stm32 spi从机模式数据能发出去吗

19 芯嵌STM32入门系列教程之十九《基于STM32的SPI总线的理解》1pdf下载_爱问共享资料
19 芯嵌STM32入门系列教程之十九《基于STM32的SPI总线的理解》1.pdf
19 芯嵌STM32入门系列教程之十九《基于STM32的SPI总线的理解》1.pdf
19 芯嵌STM32入门系列教程之十九《基于STM32的SPI…
简介:本文档为《19 芯嵌STM32入门系列教程之十九《基于STM32的SPI总线的理解》1pdf》,可适用于IT/计算机领域,主题内容包含芯嵌stmwwwstmcomCopyright福州芯嵌工作室ALLrightsreservedSTM入门系列教程基于STM的SPI总线的理解Revi符等。
侵权或盗版
*若权利人发现爱问平台上用户上传内容侵犯了其作品的信息网络传播权等合法权益时,请按照平台要求书面通知爱问!
赌博犯罪类
在此可输入您对该资料的评论~
添加成功至
资料评价:21ic官方微信-->
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
请完成以下验证码
【继续求助】关于stm32的spi从机,从机返回的数据有错位
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
本帖最后由
00:25 编辑
之前曾经发帖求助,但问题还没得到解决。再描述一下我的问题。就是我现在用stm32f103rct6做spi从机。然后主机给出8个时钟时候。MISO引脚上接了逻辑分析仪看的数据,并不是我从机DR寄存器里面的那个值。比如说我从机DR里赋值是,可是MISO上看到的波形是.我主从时序配置都是一样的这个毋庸置疑,mode的slave跟master也没有选错。从机我是这样操作的:
#include &stm32f10x_rcc.h&
#include &stm32f10x_gpio.h&
#include &sys.h&
#include &delay.h&
int main(void)
& && && && && & SPI_InitTypeDef&&SPI_InitS
& && && && && & GPIO_InitTypeDef&&GPIO_InitS& && &&&
& && && && && &
& && && & ErrorStatus HSEStartUpS
& && && && && & RCC_DeInit();& && && && && && && && && && && && && && && && &//????RCC?±??//
& && && & RCC_HSEConfig(RCC_HSE_ON);
& && && && && & HSEStartUpStatus = RCC_WaitForHSEStartUp();
& && && && && & if(HSEStartUpStatus == SUCCESS)
& & RCC_HCLKConfig(RCC_SYSCLK_Div1);
& & RCC_PCLK2Config(RCC_HCLK_Div1);
& & RCC_PCLK1Config(RCC_HCLK_Div2);
& & FLASH_SetLatency(FLASH_Latency_2);
& & FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
& & RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
& & RCC_PLLCmd(ENABLE);
& & while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
& && && && && & RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
& && && && && & RCC_APB2PeriphClockCmd(& && && &RCC_APB2Periph_GPIOB, ENABLE );& && && && && && && && && && && && && && && && && && && && && & //??? 1/4 >>?GPIO??//
& && && && && & GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_15 |&&GPIO_Pin_13);& && && && && && && && &
& && && && && & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;&&
& && && && && & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& && && && && & GPIO_Init(GPIOB, &GPIO_InitStructure);& && &&&
& && && && && &
& && && && && & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
& && && && && & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
& && && && && & GPIO_Init(GPIOB, &GPIO_InitStructure);& && &&&
& && && && && & RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE );& && && && && & //??? 1/4 >>?SPI& && &&&
& && && && && & SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullD&&
& && && && && & SPI_InitStructure.SPI_Mode = SPI_Mode_S
& && && && && & SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;& && && && && &
& && && && && & SPI_InitStructure.SPI_CPOL = SPI_CPOL_L& && && && && &
& && && && && & SPI_InitStructure.SPI_CPHA = SPI_CPHA_2E& && &&&
& && && && && & SPI_InitStructure.SPI_NSS = SPI_NSS_S& && && && && && && && && && &&&
& && && && && & SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;& && &&&
& && && && && & SPI_InitStructure.SPI_CRCPolynomial = 7;& && &&&
& && && && && & SPI_Init(SPI2, &SPI_InitStructure);
& && && && && & SPI_Cmd(SPI2, ENABLE);
& && && && && & SPI_I2S_SendData(SPI1,0xf0);
按道理来说,执行完SPI_I2S_SendData(SPI1,0xf0);数据就进去从机的DR里面了,时钟来之后就一位一位的出来,是可以用逻辑分析仪抓到的波形的,但现在不是。求助啊,就这个问题困扰我两周了,我水平很低,实在没什么办法。主机是好的
助理工程师, 积分 1617, 距离下一级还需 383 积分
助理工程师, 积分 1617, 距离下一级还需 383 积分
助理工程师, 积分 1617, 距离下一级还需 383 积分
助理工程师, 积分 1617, 距离下一级还需 383 积分
程序看起来没问题。是不是你抓的波形有问题。
直接读接收到的值对不对呢?
资深工程师, 积分 15566, 距离下一级还需 4434 积分
资深工程师, 积分 15566, 距离下一级还需 4434 积分
资深工程师, 积分 15566, 距离下一级还需 4434 积分
资深工程师, 积分 15566, 距离下一级还需 4434 积分
现在谈代码,为时尚早;
关键是从机要求的波形是什么样?主机又给了什么样?二者吻合吗?
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
程序看起来没问题。是不是你抓的波形有问题。
直接读接收到的值对不对呢? ...
你好。谢谢你的回答。其实我是这样操作的。我配置好了从机之后,就用主机给从机发送了8个时钟。然后用逻辑分析仪观察slave出来的波形,就这么简单,我用同样的方法去观察主机,能看到主机里面DR数据的波形以及时钟信号的。。。。但对从机。。然后就看到那个波形不正确。我现在没管主机接收。我也不知道问题出在哪里。我查了很多,有网友说有些口要配置成float模式,我也试过了。都是同样的结果。不过呢这个问题我不得不放一下了。我都已经花了两周时间在上面了。。。实在没办法了
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
本帖最后由
14:48 编辑
程序看起来没问题。是不是你抓的波形有问题。
直接读接收到的值对不对呢? ...按道理来说,主机给出时钟,然后MISO引脚会看到从机DR寄存器里面的值一个一个跑出来时候的波形才对啊。这个问题就是在我学习SPI时,无意中遇到的。我就想把原因揪出来。两周了。。:'(
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
现在谈代码,为时尚早;
关键是从机要求的波形是什么样?主机又给了什么样?二者吻合吗?
坚决要抵制***那个烂.到不能再烂的货:@:@!!!!!我在主机跟从机DR里分别赋值了啊,主机给出数据是观察SCLK跟MOSI引脚嘛,主机都是正确的啊,就是从机,也就是MISO引脚上观察到的数据有错,也不是全错,就是感觉多移了1位。但主机从几时钟极性都是一样的呢~!
资深工程师, 积分 15566, 距离下一级还需 4434 积分
资深工程师, 积分 15566, 距离下一级还需 4434 积分
资深工程师, 积分 15566, 距离下一级还需 4434 积分
资深工程师, 积分 15566, 距离下一级还需 4434 积分
先站在主机的角度想:MISO 与 SCK 的极性,主机能正确识别吗?如果不能,该怎么调整?
然后站在从机的角度,同样想一想 MOSI 、SCK 的关系。
什么时候双方都认可对方,就可以正确通信了。
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
我也碰到类似的问题,slave spi总是偏差一位,每次都会自动偏一位
后来发现是mode的问题,上电后clk自动变了一下导致slave每次偏差一位
不知道楼主的为什么这样
助理工程师, 积分 1617, 距离下一级还需 383 积分
助理工程师, 积分 1617, 距离下一级还需 383 积分
助理工程师, 积分 1617, 距离下一级还需 383 积分
助理工程师, 积分 1617, 距离下一级还需 383 积分
我也碰到类似的问题,slave spi总是偏差一位,每次都会自动偏一位
后来发现是mode的问题,上电后clk自动变 ...
具体是什么mode问题?能说详细点么?
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
给你参考一下,
也是主,从通信问题,我也弄了很久,在网上
看到解决方法
你参考一下
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
给你参考一下,
http://bbs.21ic.com/icview--1.html
也是主,从通信问题,我也弄了很久,在网上
帖子这么久了还有人回复,真好~!我当时弄那个问题足足一个半月,每天都在纠结。你想啊,本来是很简单的两小段程序,把我那段时间折磨得。。。。我看了一下你发给我的链接,那么说要解决这个问题的话,主从时钟极性就不能按理论上那样,设置成相同。按道理说,spi通信主机从机极性必须是一样的。但在stm32里面你要设成一样的就会有数据错位,对吧~!
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
帖子这么久了还有人回复,真好~!我当时弄那个问题足足一个半月,每天都在纠结。你想啊,本来是很简单的 ...
最后,我改成了TI模式.稳定
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
最后,我改成了TI模式.稳定
所以说stm32的spi有bug,你同意不?这是我看别人下的结论,他遇到的问题跟我们的差不多
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
初级技术员, 积分 9813, 距离下一级还需 -9713 积分
所以说stm32的spi有bug,你同意不?这是我看别人下的结论,他遇到的问题跟我们的差不多 ...
不在行这个,说不稳定,驱动其它器件时,时序设置很正常,只在两STM32主从机通迅时这样,而且我没有使用NSS脚,情况有些片面,所以还不足以说STM的SPI有BUG,
只希望后面的朋友不用在这上面花过多的时间
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
不在行这个,说不稳定,驱动其它器件时,时序设置很正常,只在两STM32主从机通迅时这样,而且我没有使用NSS脚, ...
的确是,我当时花了一个多月。而且当时网上关于这个spi问题的文章帖子几乎找不到。我还多买了2块开发板,一开始我以为自己那两块是坏的。。。以后的朋友们不要在这上面浪费时间了
高级技术员, 积分 904, 距离下一级还需 96 积分
高级技术员, 积分 904, 距离下一级还需 96 积分
高级技术员, 积分 904, 距离下一级还需 96 积分
高级技术员, 积分 904, 距离下一级还需 96 积分
奇怪,我主机用的是103ZE,从机用的是M0芯片,时钟极性配置为一样的才能正常通信。应该是要配置成一样的才对。
不知道楼主为什么会数据错位。
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
高级技术员, 积分 871, 距离下一级还需 129 积分
奇怪,我主机用的是103ZE,从机用的是M0芯片,时钟极性配置为一样的才能正常通信。应该是要配置成一样的才 ...
这个现象不止我一个人遇到过,确实是很奇怪。按道理是要配置成一样才可以的
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
求助呀,我也碰到这样的问题了,老是错位,而且主机和丛机中的任意一个复位下就又错位的不一样,好坑爹,希望楼主指点下,恳请得到楼主联系方式,拜托了
扫描二维码,随时随地手机跟帖
技术新星奖章
人才类勋章
技术高手奖章
人才类勋章
晶莹之水滴
发帖类勋章
精英会员奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
时间类勋章
您需要登录后才可以回帖stm32 f103c8t6 spi1 spi2对接 主从模式使用心得及要点 !什么叫
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//SPI_FirstBit_MSB;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//SPI_SSOutputCmd(SPI1, ENABLE);
//想知道心得由于spi2是主机,spi1从机接收:
tmp3=SPI1-&CR2;
主从合同纠纷接下来就是spi口得设置:
我用的是最小系统版+万用板手工焊接的
GPIO_Init(GPIOB,&GPIO_InitStructure);
SPI_InitTypeDef SPI_InitS
SPI2-&DR=0xff主从合同论文;//主机发送数据的目的是提供时钟信号 数据内容无意义
spi2要点主机发送数据,软件模式无需使用
SPI_Cmd(SPI2, ENABLE);
tag:stm32 c8t6 spi 主从 ssoe ssi ssm nss 无法接收 gpio配置 0x00 0xff
//spi1_cs_
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
/*Enable SPI1.NSS as a GPIO*/
//SPI_SSOutputCmd(SPI2, ENABLE);//这条语句是使得spi的cr2寄存器ssoe位置1,详情请对接看下面的连接
/*Enable SPI1.NSS as a GPIO*/
//软件模式可以通过设置spi的cr1寄存器的ssi位来内部给予nss对于什么信号,tmpx是uint16_t数据类型:
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2E
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//view/121e31ef102de2bdb.html
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullD
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_L
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_InitStructure.SPI_NSS = SPI_NSS_S //
主从合同论文经过两天的调试
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;//miso
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//miso
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
tmp=SPI1-&DRspi2;//接收
tmp=SPI1-&DR;//接收 以清空接收缓冲标志txen
获得cr1 cr2寄存spi2对接器的内容,spi2主机接收:
GPIO_Init(GPIOB,&GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能spi2
void SPI2_conf(void)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
SPI_Cmd(SPI1, DISABLE);
tmp4=SPI2-&CR2;
//spispi1主机
//spi1_cs_
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//对比一下主从合同论文使能spi1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;//sck mosi
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//cs
SPI_InitStructure.SPI_CPOL = SPI_CPOL_L
SPI_InitStructure.SPI_Mode = SPI_Mode_M
SPI_Init(SPI1, &SPI_InitStructure);
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_NSS = SPI_NSS_S
什么叫主一些测试的代码:
tmp2=SPI2-&CR1;
spi1从机发送数据,下面总结一下,主从合同论文要注意主机和从机io口配置是有区别的:
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
传送数据:
tmp1=SPI1-&CR1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//主从合同论文使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//主从合同论文使能GPIOB时钟
SPI1-&DR=0xff;//发送
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;//sck mosi
SPI_InitStructure.SPI_Mode = SPI_Mode_S
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2E
SPI_Cmd(SPI1, ENABLE);
主从合同相关规定终于调通stm32 spi1 spi2对接主从模式数据传送,要注意主机和从机io口配置是有区别的:
首先我们要打开spi1 spi2 看看主从以及gpioa gpiob的时钟:
SPI2-&DR=0xff听听主从模式使用心得及要点;//发送
SPI_Cmd(SPI2, DISABLE);
GPIO_Init(GPIOA,&GPIO_InitStructure);
然后我们要配置spi接口对应的gpio口,
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//cs
GPIO_Init(GPIOB,&GPIO_InitStructure);
void SPI1_conf(void)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
tmp=SPI2-&DR学习f103c8t6;//接收
spi2为主机 spi1为从机
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
SPI_InitStructure.SPI主从合同纠纷_Direction = SPI_Direction_2想知道使用Lines_FullD
GPIO_Init(f103c8t6GPIOA,&GPIO_InitStructure);
SPI_Init(SPI2, &SPI_InitStructure);
SPI_InitTypeDef SPI_Init主从模式使用心得及要点S
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//SPI_FirstBit_MSB;
什么叫主从合同模式什么叫主从合同其实spi1听听spi什么叫主从合同你知道什么叫主想知道什么叫主从合同f103c8t6你我不知道主从合同相关规定知道spi2对接什么叫主从合同对于主从合同相关规定stm32什么叫主从spi1合同stm32主从合同纠纷stf103c8tmspi用心stm32什么叫主从合同主从合同纠纷
来源: 蚂蚁和大象STM32的从机SPI接收数据错位问题
作为从机比较少人做。刚测试时也发现接收或发送数据错误,都向右移了一位。
分析后的原因是因为主机和从机的时钟 和极性一致。所以在主机发的时候,从机同时也收会有问题。不过有些人可能这样做也正常,不过我测试中没有正常过。
SPI_InitStructure.SPI_CPOL =SPI_CPOL_L
SPI_InitStructure.SPI_CPHA =SPI_CPHA_1E
SPI_InitStructure.SPI_NSS =SPI_NSS_H
SPI_InitStructure.SPI_CPOL = SPI_CPOL_H
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2E
SPI_InitStructure.SPI_NSS = SPI_NSS_S
测试后主机、从机收到的数据都正常。没有出现错误的问题。
原文链接:
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点现在位置:
在实现复杂控制系统中,采用单独的MCU处理起来会比较吃力,采用双MCU配合工作是不错的选择。目前cortex-m0内核定位低端,价格低廉,适合作为主控制器承担实时控制任务,对于需要复杂系统运算和高速数据采集的工作则交由cortex-m4内核器件负责,这样采用cortex-m0/m4双MCU核心的处理系统价格适中,鉴于STMCU的程序通用性佳,能够实现快速开发应用,比单独使用大容量FLASH和RAM的STM32F3/F4器件具有更好的性价比。在近距离双机通信中,采用并行接口总线是最合适的选择.因为时钟速率不同,在通信工程中,需要构建FIFO缓冲池或者FIFO芯片,开发时间较长。采用串行总线如USART/I2C/SPI等成本低、易于实现,程序开发时间短,是一般应用比较理解的选择方式。
在串行通信中,USART速率理论可以达4.5Mbps,I2C最高1M bps,SPI最高18Mbps。兼顾速率来考虑,采用SPI方式是目前比较好的选择。这一篇文章讲解一下利用SPI总线构建NUCLEO-072RB和NUCLEO-302RB开发平台的双机处理系统。第一部分讲解STM32 SPI的基本内容和SPI库函数介绍;第二部分,讲解NUCLEO-072RB和NUCLEO-302R8主从机通信代码实现。
一、STM32 SPI总线介绍及SPI库函数
STM32F0 SPI总线特点
1、3线全双工同步传输
2、2线半双工/单工同步传输
3、 时钟极性、相位以及数据位序(MSB或LSB)可设置
4、支持主设备、从设备,以及多主模式
5、 片选信号的软、硬件管理
6、硬件CRC(用于8位或16位长度的帧)
8、能触发中断的标志(TxE、RxNE、MODF、OVR、CRCERR、FRE)
9、可配置的时钟速度fPCLK/2,高达18MHz
10、BSY标志用于检查当前总线上是否有数据在传输
11、自动发送CRC的DMA传输(独立的发送、接收请求)
SPI的结构是这样的:
SPI数据帧格式
SPI根据时钟极性和相位不同分为四种通信方式
1、数据帧长度可设置:4位~16位
2、时钟极性、相位可配置
3、数据位序可设置:MSB或LSB
对于NSS引脚来说,
MCU作为主设备:
NSS做输入时,无论软件还是硬件管理,信号都要为高电平
NSS做输出时,只能是硬件管理,NSS引脚配置被拉低
MCU作为从设备:是否被选中来和主设备通信,由输入的片选电平决定
硬件管理:由NSS引脚电平决定,低电平表示被选中
软件管理:由SSI位决定,0表示被选中;NSS引脚可做它用
两个MCU利用SPI总线通信,主要是采用全双工方式进行,半双工方式速率较慢,不建议采用。下面是全双工方式的引脚连线图:
全双工模式:同时发送和接收数据,至少需要3条线:MISO、MOSI和SCK(NSS可选)
下面是STM32-NUCLEO-072RB和STM32-NUCLEO-302R8的硬件连线图:采用了PB3/PB4/PB5三个引脚,但分别属于不同的SPI模块
STM32的 SPI库函数
要理解SPI结构体定义SPI_InitTypeDef
下面是SPI_InitTypeDef结构体的各成员定义
有了结构体和成员的宏定义,利用下面的库函数,就可以实现SPI通信代码配置
stm32f0xx_spi.c定义的库函数
SPI_Init();
SPI_Cmd();
SPI_RxFIFOThresholdConfig();
SPI_NSSInternalSoftwareConfig();
SPI_SendData8();
SPI_ReceiveData8();
SPI_I2S_ITConfig();
SPI_I2S_GetFlagStatus();
SPI_I2S_GetITStatus();
SPI_I2S_ClearFlag();
一、KEIL-MDK代码实现
两个MCU通过查询的方式实现SPI通信,另外还有中断方式和DMA方式。这里通过按键控制发送不同的字符,当对方接收到字符后,实现LED灯的开关。 STM32-NUCLEO-072RB主机端代码实现
1、Keil-mdk工程模板中加入SPI.C文件,在includes.h文件中加入SPI.H头文件
2、在SPI.H头文件宏定义
3、主机端SPI1_Init()代码实现:
注意这里的SPI结构体的各参数设置要和从机的保持一致,模式设置为主机
4、主机端发送和接收函数的代码实现
5、主机端按键中断代码的实现
6、主机端main.c主函数代码实现&
将SPI初始化代码加入后,定义一个变量LED_Flag来不断查询从机发送的数据,如果是0x01,打开LED灯,如果是0x02,关闭LED灯。
STM32-NUCLEO-302R8从机端代码实现
因为NCULEO平台良好的可移植性,从机端代码配置类似。
1、Keil-mdk工程模板中加入SPI.C文件,在includes.h文件中加入SPI.H头文件
2、在SPI.H头文件宏定义
3、从机端SPI3_Init()代码实现
这里是SPI3模块,SPI模式里面设置为从机模式。
4、从机端发送和接收函数的代码实现
这个和主机代码是类似的
5、从机端按键中断代码的实现
6、从机端main.c主函数代码实现
对于从机来说,也一样,定义个SPI_Value变量来查询主机发送数据,根据数据开关LED灯。
实验连接图:
代码地址链接
http://www.eeboard.com/bbs/thread-.html
摩尔吧视频地址链接
http://www.moore8.com/courses/306

我要回帖

更多关于 stm32 spi读取数据 的文章

 

随机推荐