历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2018年04月23日 | ARM CMSIS Driver 学习 之 SPI

2018-04-23 来源:eefocus

CMSIS Driver 都有着相似的 API 函数和相似的调用方法,它是在 ST HAL 库的基础上又进一步的封装,使用和配置起来都要比 ST HAL 库要方便和简单许多,并且还是跨平台的,非常有学习和使用的价值。今天学习 SPI API 的使用,详细介绍见 CMSIS Driver SPI API

SPI 发送与接收

/** 

  ****************************************************************************** 

  * @file    main.c 

  * @author  XinLi 

  * @version v1.0 

  * @date    20-March-2018 

  * @brief   Main program body. 

  ****************************************************************************** 

  * @attention 

  * 

  *

Copyright © 2018 XinLi

 

  * 

  * This program is free software: you can redistribute it and/or modify 

  * it under the terms of the GNU General Public License as published by 

  * the Free Software Foundation, either version 3 of the License, or 

  * (at your option) any later version. 

  * 

  * This program is distributed in the hope that it will be useful, 

  * but WITHOUT ANY WARRANTY; without even the implied warranty of 

  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

  * GNU General Public License for more details. 

  * 

  * You should have received a copy of the GNU General Public License 

  * along with this program.  If not, see

  * 

  ****************************************************************************** 

  */  

  

/* Header includes -----------------------------------------------------------*/  

#include "stm32f4xx.h"  

#include "Driver_SPI.h"  

#include  

  

/* Macro definitions ---------------------------------------------------------*/  

/* Type definitions ----------------------------------------------------------*/  

/* Variable declarations -----------------------------------------------------*/  

extern ARM_DRIVER_SPI Driver_SPI1;  

  

/* Variable definitions ------------------------------------------------------*/  

static uint8_t txBuffer[5]   = {0xAB};  

static uint8_t rxBuffer[5]   = {0};  

static uint8_t dataBuffer[5] = {0};  

  

/* Function declarations -----------------------------------------------------*/  

static void SPI1_Callback(uint32_t event);  

static void SPI1_CS_Init(void);  

static void SPI1_CS_Low(void);  

static void SPI1_CS_High(void);  

static void SystemClock_Config(void);  

  

/* Function definitions ------------------------------------------------------*/  

  

/** 

  * @brief  Main program. 

  * @param  None. 

  * @return 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 the system clock to 168 MHz */  

  SystemClock_Config();  

    

  SPI1_CS_Init();  

    

  Driver_SPI1.Initialize(SPI1_Callback);  

  Driver_SPI1.PowerControl(ARM_POWER_FULL);  

  Driver_SPI1.Control(ARM_SPI_MODE_MASTER |  

                      ARM_SPI_CPOL0_CPHA0 |  

                      ARM_SPI_MSB_LSB |  

                      ARM_SPI_SS_MASTER_UNUSED |  

                      ARM_SPI_DATA_BITS(8), 10000000);  

    

  SPI1_CS_Low();  

  Driver_SPI1.Transfer(txBuffer, rxBuffer, sizeof(txBuffer));  

    

  for(;;)  

  {  

      

  }  

}  

  

/** 

  * @brief  SPI1 callback function. 

  * @param  event: SPI events notification mask. 

  * @return None. 

  */  

static void SPI1_Callback(uint32_t event)  

{  

  if(event & ARM_SPI_EVENT_TRANSFER_COMPLETE)  

  {  

    SPI1_CS_High();  

    memcpy(dataBuffer, rxBuffer, sizeof(rxBuffer));  

  }  

}  

  

/** 

  * @brief  SPI1 CS pin initialize. 

  * @param  None. 

  * @return None. 

  */  

static void SPI1_CS_Init(void)  

{  

  GPIO_InitTypeDef GPIO_InitStruct = {0};  

    

  /* GPIO Ports Clock Enable */  

  __HAL_RCC_GPIOB_CLK_ENABLE();  

    

  /* Configure GPIO pin : PtPin */  

  GPIO_InitStruct.Pin   = GPIO_PIN_14;  

  GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;  

  GPIO_InitStruct.Pull  = GPIO_PULLUP;  

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;  

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);  

    

  /* Configure GPIO pin Output Level */  

  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);  

}  

  

/** 

  * @brief  SPI1 CS pin level pull low. 

  * @param  None. 

  * @return None. 

  */  

static void SPI1_CS_Low(void)  

{  

  /* Configure GPIO pin Output Level */  

  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);  

}  

  

/** 

  * @brief  SPI1 CS pin level pull high. 

  * @param  None. 

  * @return None. 

  */  

static void SPI1_CS_High(void)  

{  

  /* Configure GPIO pin Output Level */  

  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);  

}  

  

/** 

  * @brief  System Clock Configuration 

  *         The system Clock is configured as follow :  

  *            System Clock source            = PLL (HSE) 

  *            SYSCLK(Hz)                     = 168000000 

  *            HCLK(Hz)                       = 168000000 

  *            AHB Prescaler                  = 1 

  *            APB1 Prescaler                 = 4 

  *            APB2 Prescaler                 = 2 

  *            HSE Frequency(Hz)              = 8000000 

  *            PLL_M                          = 8 

  *            PLL_N                          = 336 

  *            PLL_P                          = 2 

  *            PLL_Q                          = 7 

  *            VDD(V)                         = 3.3 

  *            Main regulator output voltage  = Scale1 mode 

  *            Flash Latency(WS)              = 5 

  * @param  None 

  * @retval None 

  */  

static void SystemClock_Config(void)  

{  

  RCC_ClkInitTypeDef RCC_ClkInitStruct;  

  RCC_OscInitTypeDef RCC_OscInitStruct;  

  

  /* Enable Power Control clock */  

  __HAL_RCC_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);  

  

  /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */  

  if (HAL_GetREVID() == 0x1001)  

  {  

    /* Enable the Flash prefetch */  

    __HAL_FLASH_PREFETCH_BUFFER_ENABLE();  

  }  

}  


推荐阅读

史海拾趣

DPA Components International公司的发展小趣事

在成功立足国内市场后,DPA Components International公司开始积极拓展国际市场。公司深入了解不同国家和地区的市场需求,针对性地调整产品策略和服务模式。通过参加国际展会、建立海外销售网络以及与国外企业合作,DPA逐渐打开了国际市场的大门。在国际市场上,DPA凭借其卓越的产品质量和专业的技术服务,赢得了众多客户的信任和支持,进一步提升了公司的品牌影响力和市场份额。

Blue Sky Research公司的发展小趣事

作为一家有社会责任感的企业,Blue Sky Research始终关注环境保护和可持续发展。公司在生产过程中采用环保材料和工艺,减少对环境的影响。同时,公司还积极参与公益事业,为社会做出贡献。通过践行社会责任,Blue Sky Research不仅赢得了社会的尊重和认可,也为企业的可持续发展注入了新的动力。

这些故事虽然基于假设和一般情况构建,但它们反映了Blue Sky Research在电子行业里可能的发展路径和战略选择。当然,实际的发展过程可能更加复杂和多元,需要更多的数据和细节来揭示。

E-CMOS(飞虹高科)公司的发展小趣事

在技术创新的同时,飞虹高科公司也积极拓展市场。然而,市场拓展的过程并非一帆风顺。公司面临着来自国内外众多竞争对手的激烈竞争,同时还要应对客户不断变化的需求。为了应对这些挑战,公司制定了一套完善的市场营销策略,积极参加国内外各类电子展会和技术交流活动,与客户建立了长期稳定的合作关系。同时,公司还不断优化产品性能和服务质量,提高客户满意度。通过这些努力,公司逐渐在市场上树立了良好的品牌形象。

ABCO公司的发展小趣事

随着技术的不断进步,ABCO公司意识到只有不断创新才能在竞争中保持领先地位。因此,公司加大了对研发的投入,建立了一支高效的技术团队。这支团队不仅成功研发出了多款具有自主知识产权的新型传感器,还积极探索传感器与其他电子设备的融合应用,为公司开辟了新的增长点。

意瑞(COSEMITECH)公司的发展小趣事

在保持核心技术优势的同时,意瑞半导体还不断扩大其产品线,涉足更多的领域,如物联网等。公司致力于提供从芯片设计到系统集成的一揽子解决方案,以满足不同客户的需求。此外,公司还积极申请专利和集成电路布图设计专有权,累计申请近20项专利发明和39项集成电路布图设计专有权,进一步巩固了其在行业中的技术领先地位。

E-Mark Inc公司的发展小趣事

DEF公司是一家跨国电子企业,在欧洲和中国都有生产基地。为了提升产品竞争力,DEF公司决定将其中国生产基地的产品进行E-Mark认证。通过跨国合作和技术交流,DEF公司成功地将中国生产的产品提升到符合欧洲标准的水平,并获得了E-Mark认证。这一认证不仅增强了DEF公司产品的市场竞争力,也促进了中欧之间的经贸合作。

问答坊 | AI 解惑

DSP和FPGA在汽车电子中的广泛应用

1 引言   20世纪末,全球范围内兴起的信息革命浪潮,为汽车工业的突破性发展提供了千载难逢的机遇,信息技术的广泛应用是解决汽车带来的诸如交通拥挤、交通安全、环境污染、能源枯竭等问题的最佳途径。同时,随着汽车电子技术的发展,电子组件 ...…

查看全部问答>

最近有关单片机中断的问题,大家帮忙看看

最近用164做了个倒计时,我用的是定时器1的方式1,倒计时可以跑起来,而且完全正常,我现在想用两个外部中断来调整时和分,但是一加上外部中断定时中断都不在响应了,我把外部中断的入口屏蔽了,倒计时正常了。如果我把定时器换为定时器0所有中断都 ...…

查看全部问答>

史上最全的IGBT资料下载

哈哈 上午清闲 传些资料 留作学习 …

查看全部问答>

ARM7 NXP236串口问题,请教高手

串口0为片内自带的,初始化的时候,U0FCR这个寄存器总是写不进去值,请教高手~~~ 附代码:[code] INT8U UART0_Init( INT32U baudrate) {     INT32U Fdiv;                 PINSEL0 &= 0 ...…

查看全部问答>

如何使用NdisAllocateIoWorkItem函数

ndis5.1中对应的函数为 VOID   NdisInitializeWorkItem(     IN PNDIS_WORK_ITEM  WorkItem,     IN NDIS_PROC  Routine,     IN PVOID  Context     ); n ...…

查看全部问答>

谁有VGA-DB15的封装资料帮我发一份

现在要画一个DB15的封装不知道参数,知道的大侠帮下!!!!!!!!!!!…

查看全部问答>

帮忙把下段程序转为c语言!跪求!!!

;*******************************;        主   程   序;*******************************MAINPG:        ANL        PCA0MD,#0 ...…

查看全部问答>

下载程序出现了这样的错误,麻烦大神帮忙看看

MSP430: Trouble Writing Memory Block at 0x0 on Page 0 of Length 0x4: Could not perform access, BSL memory segments are protected. MSP430: GEL: File: D:\\workspace_v5_2\\12864\\Debug\\12864.out: Load failed.…

查看全部问答>

fatfs 文件系统的操作步骤

请问各位大侠,fatfs文件系统读写操作步骤有没有,读写代码晒晒…

查看全部问答>