OpenEdv-开源电子网

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

STM32F407 两个SPI互相通信,SPI1与SPI2通信实验

[复制链接]

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2018-6-27
在线时间
28 小时
发表于 2018-7-17 01:26:16 | 显示全部楼层 |阅读模式
经过几天探索、查找甄别网上别人的代码,终于达成可以在一块STM32F4芯片上用SPI1与SPI2通信的功能,spi做主,spi2做从,连线方式为:PA4 ---- PB12 (NSS) , PA5 ---- PB13 (SCK), PA6 ---- PB14(MISO),  PA7 ---- PB15 (MOSI)

SPI1部分:
void init_SPI1(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = (1U << 5) |  (1U << 6) | (1U << 7) ;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_PinAFConfig(GPIOA,5,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,6,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,7,GPIO_AF_SPI1);


uint16_t tempreg = 0;
SPI_DeInit(SPI1);

tempreg = SPI1->CR1;
tempreg &= 0x3040;
tempreg |= (uint16_t)((uint32_t)SPI_Direction_2Lines_FullDuplex | SPI_Mode_Master |
                                                                SPI_DataSize_8b | SPI_CPOL_High |  
                                                                SPI_CPHA_2Edge| SPI_NSS_Soft |  
                                                                SPI_BaudRatePrescaler_4 | SPI_FirstBit_MSB);
SPI1->CR1 = tempreg;
SPI1->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SMOD);
SPI1->CRCPR = 7;
SPI1->CR1 |= SPI_CR1_SPE;



GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = (1U << 4) ;//用的是PA4,实际情况可随意用其它未复用的IO
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIOA->BSRRL |= (1U << 4); //PA4 写高电平
}

SPI2部分:
void init_SPI2(){

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = (1U << 13) |  (1U << 14) | (1U <<15) ;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOB, &GPIO_InitStructure);


GPIO_PinAFConfig(GPIOB,13,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,14,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,15,GPIO_AF_SPI2);


uint16_t tempreg = 0;
SPI_DeInit(SPI2);

tempreg = SPI2->CR1;
tempreg &= 0x3040;
tempreg |= (uint16_t)((uint32_t)SPI_Direction_2Lines_FullDuplex | SPI_Mode_Master |
                                                                SPI_DataSize_8b | SPI_CPOL_High |  
                                                                SPI_CPHA_2Edge| SPI_NSS_Soft |  
                                                                SPI_BaudRatePrescaler_4 | SPI_FirstBit_MSB);
SPI2->CR1 = tempreg;
SPI2->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SMOD);
SPI2->CRCPR = 7;
SPI2->CR1 |= SPI_CR1_SPE;


GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = (1U << 12) ;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOB, &GPIO_InitStructure);


}


传输函数部分,SPIx可以是SPI1或SPI2
u8 SPIx_transferByte(u8 data){
        u8 retry=0;
        while((SPIx->SR & SPI_I2S_FLAG_TXE)==0 && retry <= 0xFF)
        {
                retry++;
        }
        SPIx->DR = data;
        retry=0;
        while((SPIx->SR & SPI_I2S_FLAG_RXNE)==0 && retry <= 0xFF)
        {
                retry++;
        }

        return (SPIx->DR & 0x00FF);  
}

主函数部分
int main(){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB,ENABLE);

init_SPI1();
init_SPI2();
u16 data1 =0,data2=0;
  while(1){
             GPIOA->BSRRH |= (1U << 4); //PA4 写低电平
            data1  = SPIx_transferByte(0x11);
           data2=    SPIx_transferByte(0x22);
          GPIOA->BSRRL |= (1U << 4); //PA4 写高电平
          delay(10);//wait 0.01s
  }
}

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

使用道具 举报

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2018-6-27
在线时间
28 小时
 楼主| 发表于 2021-8-26 14:27:19 | 显示全部楼层
回复 支持 1 反对 1

使用道具 举报

3

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-9-19
在线时间
7 小时
发表于 2018-9-29 08:45:58 来自手机 | 显示全部楼层
楼主,请问下两个spi的nss必须要连上么?只用sck,mosi和miso不行么
回复 支持 反对

使用道具 举报

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2018-6-27
在线时间
28 小时
 楼主| 发表于 2018-12-18 22:47:21 | 显示全部楼层
不必须连接
回复 支持 反对

使用道具 举报

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2018-6-27
在线时间
28 小时
 楼主| 发表于 2018-12-18 22:48:03 | 显示全部楼层
lslll 发表于 2018-9-29 08:45
楼主,请问下两个spi的nss必须要连上么?只用sck,mosi和miso不行么

不用必须连接
回复 支持 反对

使用道具 举报

2

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-8-7
在线时间
53 小时
发表于 2018-12-18 22:52:56 | 显示全部楼层
原子哥提供的例程不能自环通讯吗,虽然我没有测试过。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-1-1
在线时间
1 小时
发表于 2019-1-1 22:12:53 | 显示全部楼层
本帖最后由 yt2000 于 2019-1-1 22:15 编辑

STM32F103用SPI1的16位从模式发送数据,另一个STM32F103的SPI1是主模式,每次16bit没问题,但如果是32bit,2个16bit的间隔是1us,主模式的STM32收到的数据就是乱的,STM32不能进行32bit传输?还是说2次16bit的间隔太短?用的是16bit的DMA模式,2个16bit数据间的间隔有什么要求吗?手册上也没有这些技术参数
回复 支持 反对

使用道具 举报

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2018-6-27
在线时间
28 小时
 楼主| 发表于 2019-1-15 11:39:45 | 显示全部楼层
yt2000 发表于 2019-1-1 22:12
STM32F103用SPI1的16位从模式发送数据,另一个STM32F103的SPI1是主模式,每次16bit没问题,但如果是32bit,2个1 ...

stm32的spi好像是发一个就必须收一个,你要判断发送TXE或接收RXNE的标志寄存器,不过1us等待时间也够长了,提高下波特率试试
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2015-3-31
在线时间
192 小时
发表于 2019-2-21 21:51:00 | 显示全部楼层
u8 retry=0;         while((SPIx->SR & SPI_I2S_FLAG_TXE)==0 && retry <= 0xFF)。这个语句retry值在0~0xFF之间,retry<=0xFF 将始终成立。这个超时判断不需要=吧?<=   <
回复 支持 反对

使用道具 举报

34

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
857
金钱
857
注册时间
2018-9-16
在线时间
240 小时
发表于 2019-7-2 14:32:40 | 显示全部楼层
楼主问下你,两快407板子接线是MISO接MISO吗,还是MISO与MOSI交叉接线
回复 支持 反对

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2016-9-5
在线时间
21 小时
发表于 2021-8-16 11:37:11 | 显示全部楼层
你这调通了一次,就各种论坛发帖,你累不累
回复 支持 反对

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2016-9-5
在线时间
21 小时
发表于 2021-8-31 17:27:21 | 显示全部楼层

看来你的卵经常有事
回复 支持 反对

使用道具 举报

2

主题

594

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1456
金钱
1456
注册时间
2019-7-28
在线时间
136 小时
发表于 2021-12-23 10:31:05 | 显示全部楼层
分享   
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2022-5-17
在线时间
1 小时
发表于 2022-7-11 09:13:50 | 显示全部楼层
楼主我想请问这个最后得输出结果是怎么样得?
我写的一样得,最后没有输出,不知道是哪里出问题了,一直显示得SPI1得255,SPI2显示0
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-4-20 19:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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