求教stm32 spi1和spi2区别四种spi方式的区别

想请教一个关于STM32 SPI时钟的问题==www.ic37.com
热门型号:
&&&当前位置:
想请教一个关于STM32 SPI时钟的问题
用户名:adofu2008
注册时间: 17:32:00
想请教一个关于STM32 SPI时钟的问题
STM32的SPI在作为主设备,与一个带有SPI接口的AD芯片通信。
时钟,相位都配置的对,数据位配置为8位。
我想问一下:在STM32的SPI主设备从从设备读取数据时,是不是需要主SPI为了提供从SPI的时钟而需要向SPI任意发送一个字节的数据才能从从设备中读取数据?
如果是,这个时钟是8个SCLK,还是16个SCLK
用户名:香水城
注册时间: 18:11:00
这个问题要看你的SPI设备什么时候要发送数据,需要多少个时钟周期?
用户名:adofu2008
注册时间: 15:58:00
我用绝对地址去取SPI1_DR的内容,在MEMORY也看到数据了,在SPI1_DR中也看到数据了,就是用指针去指这个绝对地址时总是第一个数据取不出来,其余的数据都可以取出来,而且也都正确,请问您一下这是什么原因呢?
用户名:adofu2008
注册时间: 15:59:00
我用绝对地址去取SPI1_DR的内容,在MEMORY也看到数据了,在SPI1_DR中也看到数据了,就是用指针去指这个绝对地址时总是第一个数据取不出来,其余的数据都可以取出来,而且也都正确,请问您一下这是什么原因呢?
用户名:香水城
注册时间: 16:04:00
我不明白“用绝对地址去取SPI1_DR的内容”与“用指针去指这个绝对地址”有什么区别?
如果“总是第一个数据取不出来”,可能需要像你在楼主位说的那样“需要主SPI为了提供从SPI的时钟而需要向SPI任意发送一个字节的数据才能从从设备中读取数据”。
用户名:adofu2008
注册时间: 16:16:00
这是我的附件,东西都在里边呢,不用看帖子上的代码了。
用户名:香水城
注册时间: 16:23:00
对不起,我没有时间看你的代码。
用户名:adofu2008
注册时间: 16:34:00
那我给你贴出来吧,u32 *p = (u32 *)0x4000380C;//这是定义SPI2―DR的地址
for(im=0;im&25;im++)
{
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, temp++);
Delay(1);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, 0X00);
Delay(1);
//以上两个发送是一个命令字,提供给某一个SPI接口的芯片命令字。
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, 0X00);//这个就是任意发送的一个字节,为了给从SPI提供一个时钟信号
Regs_Value[im] = *p;//P指向的就是SPI2-DR,从芯片内部读取数据,放到数组Regs_Value里
Delay(1);
}
以上是我取了25个值,这25个值是由一个芯片输出的。
用户名:adofu2008
注册时间: 16:40:00
这个是四张抓图,您看一下吧。
用户名:香水城
注册时间: 17:02:00
我5楼的帖子你看见了吗? 8楼贴出的代码与我5楼的帖子有关吗?
用户名:adofu2008
注册时间: 17:18:00
10# 香水城
我看过了,可是我在读取数据时已经发送过时钟了啊,况且我后面的数据也都是正确的啊?这个P也就是指向SPI2-DR的地址,我没有用库里的SPI-Receive()函数来读取,(我以前用来,也读不出来的,我才想着用指针去读的),我的那几张截图就是说明这个问题的。我感到很是奇怪,希望您帮我解惑一下。谢谢您!
用户名:janeslee
注册时间: 17:49:00
可能是读SPI_DR之前没判断SPI_I2S_FLAG_RXNE位。
用户名:adofu2008
注册时间: 17:59:00
判断也不行啊,我已经试过了,这个问题困惑我好几天了。有知道的请回复一下,谢谢了。
用户名:janeslee
注册时间: 18:15:00
还有个可能,是你前面只SEND,实际SPI_DR也收到数据了但没有读出,会产生OVR错误,后来从SPI_DR读出的是之前的数据。你试试每次SEND之后都读一次SPIDR。
用户名:adofu2008
注册时间: 18:17:00
好的,我试试吧,我这个芯片是发送两个命令字才送出一个数据的,也就是在第17个时钟沿儿才会有数据的。按你说的,那芯片就错了。我用示波器看过,数据也确定是在第17个时钟沿儿到来的。
用户名:adofu2008
注册时间: 18:24:00
14# janeslee
不行啊,兄弟,我这个以前也试过了,还是不会出来啊?
用户名:香水城
注册时间: 18:34:00
你把图片直接贴出来不好吗? 不知道为什么,我这里不能下载。
用户名:janeslee
注册时间: 18:36:00
没道理啊。。。你把优化级别设置为0看看,或者把你新程序贴出来看看
用户名:adofu2008
注册时间: 7:38:00
大哥,不是我不想上传,而是这里上传图片太麻烦了。以下是我传到别的网站又转过来的,您看一下吧。谢谢。第一次读数据
第二次读数据
第三次是个0X00所以没截图
以下是第四次的
这个是第N次的
用户名:adofu2008
注册时间: 15:17:00
20# 香水城
可能是我级别太低吧,我这儿没有高级回复的功能。
只有以下几个功能:
08:45 | 只看该作者 回复 引用 评分 报告 返回版面 TOP&&
用户名:香水城
注册时间: 18:41:00
晕,每个人都有,就在输入框的右上角,
用户名:adofu2008
注册时间: 22:20:00
哦,没有看见,以前没发过图片。呵呵...
第三次取到的数据是0X00,没有截图。
用户名:adofu2008
注册时间: 17:49:00
你看一下,是不是这个,谢谢了。
用户名:adofu2008
注册时间: 17:49:00
24# 香水城
我设置的是一次只读一个寄存器的。
用户名:adofu2008
注册时间: 8:44:00
24# 香水城
没人回复了?
用户名:adofu2008
注册时间: 11:35:00
我想请教您一下:假设SPI1为主设备,SPI2为从设备,这个
SPI_SendData(SPI2,0X55);
函数中的0X55写在SPI2的哪个寄存器了?我看库函数写的是DR寄存器,但是通过SPI-DR寄存器并没有看到0X55这个数啊?谢谢!
用户名:香水城
注册时间: 12:02:00
读写SPI_DR操作的是不同的物理寄存器,读时操作的是接收寄存器,写时操作的是发送寄存器,程序员无法读发送寄存器,也无法写接收寄存器!
用户名:香水城
注册时间: 15:16:00
STM32的SPI在作为主设备,与一个带有SPI接口的AD芯片通信。
& && &时钟,相位都配置的对,数据位配置为8位。
& && &我想问一下:在STM32的SPI主设备从从设备读取数据时,是不是需要主SPI为了提供从SPI的时钟而需要向SPI任意发送一个字节的数据才能从从设备中读取数据?
& && &如果是,这个时钟是8个SCLK,还是16个SCLK?
& && &谢谢!
adofu2008 发表于
用户名:adofu2008
注册时间: 18:05:00
30# 香水城
现在调试出现了一个问题,本来是第一次读就该出来的数据,却在第二次读的时候才出来,例如:从某个SPI芯片读出来的数据,时序图已经贴过,读第一次应出来数据0x52,第二次0X86,第三次0X54,。。。依次把它们放进一个数组中。REGS[],出现这样一个怪现象,REGS[0] = 0X00,REGS[1]=0X52,REGS[2]=0X86,REGS[3]=0X54,。。。,我保证数组索引没有错。数据读时序就是25楼帖的图。想请教一下香大侠:这是什么原因呢?
& && &我猜是下面的一个原因,不知道对不对?还望指教。
& && &SPI-DR是一个16位的循环移位寄存器,我设置的是MSB先出,8位的数据格式。可能是这个寄存器先把读出来的8位数据移位到SPI-DR中的高八位,再读进下一个8位数据时,先前读出来的8位数据被移位到低8位,从而被读出来。在读第三个数据时,第二个数据被移位到低8位,依次类推。是不是这样的呢?谢谢。
用户名:香水城
注册时间: 18:51:00
你的猜测是错误的,按照你的猜测,就没有必要设置8位或16位模式了。
你把读数据的那部分代码贴出来看看。
用户名:adofu2008
注册时间: 10:16:00
本帖最后由 adofu2008 于
10:21 编辑
32# 香水城
for(im=0;im&25;im++)
{
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, temp++);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, 0X00);
//以上两个发送是一个命令字,提供给某一个SPI接口的芯片命令字。
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, 0X00);//这个就是任意发送的一个字节,为了给从SPI提供一个时钟信号
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==RESET);
Regs_Value[im]&&=&&SPI_I2S_ReceiveData(SPI2);//从芯片内部读取数据,放到数组Regs_Value里
用户名:adofu2008
注册时间: 10:21:00
我用模拟的SPI都没有这个问题,读出来的数据也没有我在31楼所说的问题。但我调试一些ST读SPI接口的FLASH芯片的例程时,也没有发现数据移位的问题。不知道这个为什么会出现这个问题?实在不解,望指教!谢谢!
用户名:香水城
注册时间: 10:29:00
你有没有用示波器看看33楼的程序产生的波形?
用户名:adofu2008
注册时间: 14:50:00
时钟正常,STM32的DIN管脚有数据输入,DR里有值,但就是取不出来。当第二次发送时钟时,数据就出来了。
用户名:香水城
注册时间: 14:54:00
时钟正常,STM32的DIN管脚有数据输入,DR里有值,但就是取不出来。当第二次发送时钟时,数据就出来了。
adofu2008 发表于
用户名:adofu2008
注册时间: 17:54:00
本帖最后由 adofu2008 于
10:22 编辑
1.通过KEIL软件的SPI外设的窗口发现SPI-DR是有值的。且值是对的。
2.“取不出来”意思就是Regs_Value[im] =& &SPI_I2S_ReceiveData(SPI2);这条语句没有起作用,或者说,在SPI的下一条发送八个时钟的语句中即下一句:
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, temp++);
才读出了本该在上一次读出的数据。
3.第二次发送时钟就是指我在开始说的:为了向从设备提供一个时钟,不是发送第二个命令字的时钟,而是为了从从设备读取数据。
不知道我描述的清楚了没有?呵呵。。。谢谢!
用户名:香水城
注册时间: 18:24:00
1.通过KEIL软件的SPI外设的窗口发现SPI-DR是有值的。且值是对的。
2.“取不出来”意思就是Regs_Value = =&&SPI_I2S_ReceiveData(SPI2);这条语句没有起作用,或者说,在SPI的下一条发送八个时钟的语句中即下一句:
adofu2008 发表于
用户名:adofu2008
注册时间: 10:22:00
不好意思啊,笔误,不小心沾错了。再说了,如果是两个等号,后面的数据应该一个也读不出来啊?呵呵。。。
热门型号:STM32的SPI主从机模式
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
STM32的SPI主从机模式
&void RCC_Configuration(void)
/* PCLK2 = HCLK/2 */
RCC_PCLK2Config(RCC_HCLK_Div2);
/* Enable peripheral clocks --------------------------------------------------*/
/* GPIOA, GPIOB and SPI1 clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_SPI1, ENABLE);
/* SPI2 Periph clock enable */
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
注意主从机的GPIO设置不一样
,GPIO口的NSS一定要设置成开漏输出
void GPIO_Configuration(void)
GPIO_InitTypeDef GPIO_InitS
/* Configure SPI1 pins: SCK, MISO and MOSI ---------------------------------*/
//主机GPIO口设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//miso
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//cs
GPIO_Init(GPIOA,&GPIO_InitStructure);
/* //从机GPIO口设置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;//sck mosi
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//miso
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//cs
GPIO_Init(GPIOA,&GPIO_InitStructure);
接下来就是spi口得设置:
void SPI1_conf(void)
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullD//SPI_Direction_1Line_Rx;//
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_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
/* Enable SPI_SLAVE */
SPI_Cmd(SPI1, ENABLE);
SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reservedstm32cube教程之SPI代码(官方版),帖子快够了吧_stm32cube吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:487贴子:
stm32cube教程之SPI代码(官方版),帖子快够了吧收藏
******************************************************************************
SPI/SPI_FullDuplex_ComPolling/Src/main.c
MCD Application Team
26-February-2014
This sample code shows how to use STM32F4xx SPI HAL API to transmit
and receive a data buffer with a communication process based on
Polling transfer.
The communication is done using 2 Boards.
******************************************************************************
* @attention
* &h2&&center&& COPYRIGHT(c) 2014 STMicroelectronics&/center&&/h2&
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of STMicroelectronics nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************
*//* Includes ------------------------------------------------------------------*/#include "main.h"/** @addtogroup STM32F4xx_HAL_Examples
*//** @addtogroup SPI_FullDuplex_ComPolling
*/ /* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Uncomment this line to use the board as master, if not it is used as slave */#define MASTER_BOARD/* Private variables ---------------------------------------------------------*//* SPI handler declaration */SPI_HandleTypeDef SpiH/* Buffer used for transmission */uint8_t aTxBuffer[] = "****SPI - Two Boards communication based on Polling **** SPI Message ******** SPI Message ******** SPI Message ****";/* Buffer used for reception */uint8_t aRxBuffer[BUFFERSIZE];/* Private function prototypes -----------------------------------------------*/static void SystemClock_Config(void);static void Error_Handler(void);static void Timeout_Error_Handler(void);static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);/* Private functions ---------------------------------------------------------*//**
Main program.
* @retval None
*/int main(void){
/* STM32F4xx HAL library initialization:
- Configure the Flash prefetch, instruction and Data caches
- Configure the Systick to generate an interrupt each 1 msec
- Set NVIC Group Priority to 4
- Global MSP (MCU Support Package) initialization
HAL_Init();
/* Configure LED3, LED4, LED6 and LED5 */
BSP_LED_Init(LED3);
BSP_LED_Init(LED4);
BSP_LED_Init(LED6);
BSP_LED_Init(LED5);
/* Configure the system clock to have a system clock = 180 Mhz */
SystemClock_Config();
/*##-1- Configure the SPI peripheral #######################################*/
/* Set the SPI parameters */
SpiHandle.Instance
SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
SpiHandle.Init.Direction
= SPI_DIRECTION_2LINES;
SpiHandle.Init.CLKPhase
= SPI_PHASE_1EDGE;
SpiHandle.Init.CLKPolarity
= SPI_POLARITY_HIGH;
SpiHandle.Init.CRCCalculation
= SPI_CRCCALCULATION_DISABLED;
SpiHandle.Init.CRCPolynomial
SpiHandle.Init.DataSize
= SPI_DATASIZE_8BIT;
SpiHandle.Init.FirstBit
= SPI_FIRSTBIT_MSB;
SpiHandle.Init.NSS
= SPI_NSS_SOFT;
SpiHandle.Init.TIMode
= SPI_TIMODE_DISABLED;
#ifdef MASTER_BOARD
SpiHandle.Init.Mode = SPI_MODE_MASTER;#else
SpiHandle.Init.Mode = SPI_MODE_SLAVE;#endif /* MASTER_BOARD */
if(HAL_SPI_Init(&SpiHandle) != HAL_OK)
/* Initialization Error */
Error_Handler();
#ifdef MASTER_BOARD
/* Configure Tamper push button */
BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO);
/* Wait for Tamper Button press before starting the Communication */
while (BSP_PB_GetState(BUTTON_KEY) != 1)
BSP_LED_Toggle(LED3);
HAL_Delay(40);
BSP_LED_Off(LED3);#endif /* MASTER_BOARD */
/*##-2- Start the Full Duplex Communication process ########################*/
/* While the SPI in TransmitReceive process, user can transmit data through
"aTxBuffer" buffer & receive data through "aRxBuffer" */
/* Timeout is set to 5S */
switch(HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE, 5000))
case HAL_OK:
/* Communication is completed ___________________________________________ */
/* Compare the sent and received buffers */
if(Buffercmp((uint8_t*)aTxBuffer, (uint8_t*)aRxBuffer, BUFFERSIZE))
/* Transfer error in transmission process */
Error_Handler();
/* Turn LED4 on: Transfer in transmission process is correct */
BSP_LED_On(LED4);
/* Turn LED6 on: Transfer in reception process is correct */
BSP_LED_On(LED6);
case HAL_TIMEOUT:
/* A Timeout Occur ______________________________________________________*/
/* Call Timeout Handler */
Timeout_Error_Handler();
/* An Error Occur ______________________________________________________ */
case HAL_ERROR:
/* Call Timeout Handler */
Error_Handler();
/* Infinite loop */
This function is executed in case of error occurrence.
* @retval None
*/static void Error_Handler(void){
/* Turn LED5 (RED) on */
BSP_LED_On(LED5);
System Clock Configuration
The system Clock is configured as follow :
System Clock source
= PLL (HSE)
SYSCLK(Hz)
AHB Prescaler
APB1 Prescaler
APB2 Prescaler
HSE Frequency(Hz)
Main regulator output voltage
= Scale1 mode
Flash Latency(WS)
* @retval None
*/static void SystemClock_Config(void){
RCC_ClkInitTypeDef RCC_ClkInitS
RCC_OscInitTypeDef RCC_OscInitS
/* Enable Power Control clock */
__PWR_CLK_ENABLE();
/* The voltage scaling allows optimizing the power consumption when the device is
clocked below the maximum system frequency, to update the voltage scaling value
regarding system frequency refer to product datasheet.
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/* Enable HSE Oscillator and activate PLL with HSE as source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);}/**
SPI error callbacks
hspi: SPI handle
This example shows a simple way to report transfer error, and you can
add your own implementation.
* @retval None
*/ void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi){
/* Turn LED5 on: Transfer error in reception/transmission process */
BSP_LED_On(LED5); }/**
This function is executed in case of error occurrence.
* @retval None
*/static void Timeout_Error_Handler(void){
/* Toggle LED5 on */
BSP_LED_On(LED5);
HAL_Delay(500);
BSP_LED_Off(LED5);
HAL_Delay(500);
Compares two buffers.
pBuffer1, pBuffer2: buffers to be compared.
BufferLength: buffer's length
* @retval 0
: pBuffer1 identical to pBuffer2
&0 : pBuffer1 differs from pBuffer2
*/static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength){
while (BufferLength--)
if((*pBuffer1) != *pBuffer2)
return BufferL
pBuffer1++;
pBuffer2++;
return 0;}#ifdef
USE_FULL_ASSERT/**
Reports the name of the source file and the source line number
where the assert_param error has occurred.
file: pointer to the source file name
line: assert_param error line source number
* @retval None
*/void assert_failed(uint8_t* file, uint32_t line){
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
}}#endif/**
*//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
stm32cube,敬请访问STM32中国官方网站固件与软件专区.注册STM32会员,尊享官方设计资源,视频与培训教程无限制下载,更可积分免费兑换开发板
官方的程序好简单啊。。。。。
官方例程似乎没有片选信号啊,发送和接收是怎么完成的呢,难道真的不要么???有没有测试出来过?
登录百度帐号

我要回帖

更多关于 stm32 spi1和spi2区别 的文章

 

随机推荐