完整源码.rar
(1.4 MB, 售价: 2 E币)
使用了固件库,附件中用windows画图工具画了几幅示意图帮助理解,图画得比较丑,希望能帮助到其他人
部分源程序如下:完整源码请参考本文附件- #include "stm32f4xx.h"
- #include "spi.h"
- void spi1_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- SPI_InitTypeDef SPI_InitStruct;
-
- //开启SPI1 和 GPIOB的时钟
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
-
-
- //设置引脚 PB3--SPI1_SCK PB4--SPI1_MISO PB5--SPI1_MOSI
- //模式、推挽、是否上拉等等
-
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
- GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5; //3 4 5号引脚
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//内部上拉电阻
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//快速
- GPIO_Init(GPIOB, &GPIO_InitStruct);
-
- //复用为SPI1
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);
-
- //PB14---作为 W25Q128的片选
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//输出模式
- //GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14; //14号引脚
- //GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//内部上拉电阻
- //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//快速
- GPIO_Init(GPIOB, &GPIO_InitStruct);
-
- //默认先不选中W25Q128
- CS = 1;
- //关于主从模式 高低位那个先发 8或16bits 时钟的频率 极性和相位
- SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
- //W25Q128 MODE 3
- SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;//从机mode 3的需求
- SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;//从机mode 3的需求
- SPI_InitStruct.SPI_CRCPolynomial = 7;//校验和多项式有几项
- SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//从机的需求
- SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//两线全双工
- SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//从机的需要
- SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
- SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//软件管理片选引脚
- SPI_Init(SPI1, &SPI_InitStruct);
- //使能SPI1
- SPI_Cmd(SPI1, ENABLE);
-
- }
- unsigned char spi1_write_read_byte(unsigned char data)
- {
- //等上一次发送完成
- while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != SET);
-
- SPI_I2S_SendData(SPI1, data);
-
- //等接收缓冲非空
- while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != SET);
-
- return SPI_I2S_ReceiveData(SPI1);
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|