——基于STM32F103RCT6
---- 标准库:
说明:相关文件共有两个:bsp_spi_cc1101.h;bsp_spi_cc1101.c;以SPI2为例。
1、“bsp_spi_cc1101.h”中的参数定义:
#ifndef _BSP_SPI_1101_H_
#define _BSP_SPI_1101_H_
#include #include "stm32f10x.h" #include "misc.h" #include "os_cfg_app.h" #include "os.h" #include "core_cm3.h" #include "bsp.h" #include "stm32f10x_spi.h" #define CSN_CC1101_GPIO GPIOB #define CSN_CC1101_GPIO_PIN GPIO_Pin_12 #define SPI_CC1101_GPIO GPIOB #define SCK_CC1101_GPIO_PIN GPIO_Pin_13 #define MISO_CC1101_GPIO_PIN GPIO_Pin_14 #define MOSI_CC1101_GPIO_PIN GPIO_Pin_15 #define GDO0_CC1101_GPIO GPIOA #define GDO0_CC1101_GPIO_PIN GPIO_Pin_11 #define SPI_GPIO_RCC_1 RCC_APB2Periph_GPIOB #define SPI_GPIO_RCC_2 RCC_APB2Periph_GPIOA #define CC1101_SPI SPI2 #define CSN_SET GPIO_SetBits(GPIOB,GPIO_Pin_12) #define CSN_RESET GPIO_ResetBits(GPIOB,GPIO_Pin_12) void SPI_CC1101_Init(void); u8 SPI2_ReadWriteByte(u8 TxData); #endif 2、“bsp_spi_cc1101.c”中的引脚及SPI功能初始化: #include "bsp_spi_cc1101.h" void SPI_CC1101_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(SPI_GPIO_RCC_1 | SPI_GPIO_RCC_2,ENABLE); //初始化GPIO时钟 /*********SPI1初始化内容**** RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); //初始化SPI1时钟 ******SPI1初始化内容******/ /*********SPI2初始化内容************/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); //初始化SPI2时钟 /********SPI3需要初始化的内容******** RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); //初始化SPI3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //初始化复用IO时钟,重定向IO口 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //由于SPI3占用JTAG口,所以需要关闭JTAG ******SPI3需要初始化的内容*******/ //片选设定成通用IO模式 GPIO_InitStructure.GPIO_Pin=CSN_CC1101_GPIO_PIN; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(CSN_CC1101_GPIO,&GPIO_InitStructure); //SCK时钟IO初始化 GPIO_InitStructure.GPIO_Pin=SCK_CC1101_GPIO_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(SPI_CC1101_GPIO,&GPIO_InitStructure); //MISO的IO初始化 GPIO_InitStructure.GPIO_Pin=MISO_CC1101_GPIO_PIN; GPIO_Init(SPI_CC1101_GPIO,&GPIO_InitStructure); //MOSI的IO初始化 GPIO_InitStructure.GPIO_Pin=MOSI_CC1101_GPIO_PIN; GPIO_Init(SPI_CC1101_GPIO,&GPIO_InitStructure); //RF1101中用到的GDO0的IO初始化 GPIO_InitStructure.GPIO_Pin=GDO0_CC1101_GPIO_PIN; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GDO0_CC1101_GPIO,&GPIO_InitStructure); //SPI模式设置 SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //全双工模式 SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //主设备模式 SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b; //8字节数据通信 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟空闲时为低电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //时钟奇数边沿采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制NSS(CSN)位 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //通信速率设定,波特率预分频值 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC计算多项式 SPI_Init(CC1101_SPI, &SPI2_InitStructure); //初始化 SPI_Cmd(CC1101_SPI, ENABLE); //使能 SPI2_ReadWriteByte(0xFF); //RF1101启动传输 } u8 SPI2_ReadWriteByte(u8 TxData) { u8 Rxdata; uint32_t SPITimeout =0x1000; while (SPI_I2S_GetFlagStatus(CC1101_SPI , SPI_I2S_FLAG_TXE) == RESET) //检测发送缓存区是否为空 { if((SPITimeout--) == 0) return 0; } SPI_I2S_SendData(CC1101_SPI,TxData); //发送一个字节 while (SPI_I2S_GetFlagStatus(CC1101_SPI , SPI_I2S_FLAG_RXNE) == RESET) //检测接收缓存区是否为空 { if((SPITimeout--) == 0) return 0; } Rxdata = SPI_I2S_ReceiveData(CC1101_SPI); //存储一个字节 return Rxdata; } ---- HAL库: 以SPI1为例: SPI_HandleTypeDef SPI1_Handler; void SPI1_Init(void) { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 __HAL_RCC_SPI1_CLK_ENABLE(); //使能SPI1时钟 //NSS配置成通用IO口 GPIO_Initure.Pin=GPIO_PIN_4; GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; GPIO_Initure.Pull=GPIO_PULLUP; GPIO_Initure.Speed=GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOA,&GPIO_Initure); //SPI引脚初始化 GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_Initure.Mode=GPIO_MODE_AF_PP; GPIO_Initure.Pull=GPIO_PULLUP; GPIO_Initure.Speed=GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOA,&GPIO_Initure); //SPI功能配置 SPI1_Handler.Instance=SPI1; //SPI1 SPI1_Handler.Init.Mode=SPI_MODE_MASTER; //主模式 SPI1_Handler.Init.Direction=SPI_DIRECTION_2LINES; //双线模式 SPI1_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //发送接收8位帧结构 SPI1_Handler.Init.CLKPolarity=SPI_POLARITY_LOW; //时钟的空闲状态为高电平 SPI1_Handler.Init.CLKPhase=SPI_PHASE_1EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI1_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI1_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256; //定义波特率预分频的值:波特率预分频值为256 SPI1_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI1_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式 SPI1_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE; //关闭硬件CRC校验 SPI1_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式 HAL_SPI_Init(&SPI1_Handler); //初始化 __HAL_SPI_ENABLE(&SPI1_Handler); //使能SPI1 SPI1_ReadWriteByte(0xFF); //RF1101启动传输 } //SPI底层驱动,时钟使能,引脚配置 //此函数会被HAL_SPI_Init()调用 //hspi:SPI句柄 void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 __HAL_RCC_SPI1_CLK_ENABLE(); //使能SPI1时钟 //PB13,14,15 GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_Initure.Mode=GPIO_MODE_AF_PP; GPIO_Initure.Pull=GPIO_PULLUP; GPIO_Initure.Speed=GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOA,&GPIO_Initure); } void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler) { assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); //判断有效性 __HAL_SPI_DISABLE(&SPI1_Handler); //关闭SPI SPI1_Handler.Instance->CR1&=0XFFC7; //位3~5清零,用来设置波特率 SPI1_Handler.Instance->CR1|=SPI_BaudRatePrescaler; //设置SPI速度 __HAL_SPI_ENABLE(&SPI1_Handler); //使能SPI } u8 SPI1_ReadWriteByte(u8 TxData) { u8 Rxdata; HAL_SPI_TransmitReceive(&SPI1_Handler,&TxData,&Rxdata,1, 1000); return Rxdata; } 注:与HAL库有一定的区别;重点注意SPI3与其他两个的区别;务必要检测缓存区是否为空。
上一篇:STM32F42XX SPI3无输出问题
下一篇:stm32F411 SPI3 无输出
推荐阅读
史海拾趣
随着环保意识的日益增强,Artaflex公司积极响应绿色发展的号召,将环保理念融入企业的生产和经营中。公司采用环保材料和生产工艺,减少生产过程中的环境污染。同时,公司还加强废弃物的处理和回收利用,降低对环境的影响。这一举措不仅提升了公司的社会形象,也为其在绿色电子市场中赢得了更多的商机。
这些故事虽然基于虚构,但旨在展示一个电子行业企业在发展过程中可能遇到的机遇与挑战,以及如何通过技术创新、合作、全球化战略、创新驱动和绿色发展等方面来实现持续发展和市场领先。请注意,这些故事并不代表Artaflex公司的真实历史或现状。如需了解Artaflex公司的真实发展故事,请查阅相关公司资料或新闻报道。
随着电子行业的快速发展,市场竞争日益激烈。为了保持领先地位,Artaflex公司积极寻求与其他企业的技术合作。通过与一家知名半导体公司的合作,双方共同研发了一款新型芯片,不仅提升了产品的性能,还降低了生产成本。这一合作不仅增强了Artaflex的技术实力,也为其打开了更广阔的市场空间。
随着国内市场的逐渐饱和,ESTEK公司开始将目光投向国际市场。公司制定了详细的国际化战略,通过参加国际展会、拓展海外销售渠道等方式,积极开拓国际市场。同时,ESTEK公司还积极引进国外先进的技术和管理经验,不断提升自身的竞争力和国际化水平。在国际市场上,ESTEK公司的产品逐渐获得了认可,公司的国际影响力也日益增强。
随着产品质量的不断提升和市场口碑的积累,Accetek公司开始积极拓展国内外市场。公司参加了多个国际电子展览和交流活动,与全球多家知名企业建立了合作关系。同时,公司还加强了品牌建设和市场推广工作,通过广告宣传、媒体合作等方式提高品牌知名度和美誉度。这些举措有效地提升了公司的市场竞争力,为公司的快速发展提供了有力支持。
在发展过程中,Block USA Inc.也面临着来自竞争对手和行业变化的挑战。然而,公司始终保持着创新精神,不断调整和优化产品与服务,以适应市场的变化。例如,面对数据安全和隐私保护的日益严格要求,Block加强了其数据保护措施,并公开承认了数据泄露事件并积极采取措施进行补救。同时,公司还继续拓展其业务边界,探索新的增长点,以保持其在电子行业中的竞争优势。
这些故事只是Block USA Inc.在电子行业发展历程中的一部分,它们展示了公司如何通过不断创新和拓展业务领域,逐步成为一家具有影响力的综合性电子企业。然而,随着市场的不断变化和竞争的加剧,Block仍需保持警惕并持续努力,以应对未来的挑战和机遇。
在发展过程中,Block USA Inc.也面临着来自竞争对手和行业变化的挑战。然而,公司始终保持着创新精神,不断调整和优化产品与服务,以适应市场的变化。例如,面对数据安全和隐私保护的日益严格要求,Block加强了其数据保护措施,并公开承认了数据泄露事件并积极采取措施进行补救。同时,公司还继续拓展其业务边界,探索新的增长点,以保持其在电子行业中的竞争优势。
这些故事只是Block USA Inc.在电子行业发展历程中的一部分,它们展示了公司如何通过不断创新和拓展业务领域,逐步成为一家具有影响力的综合性电子企业。然而,随着市场的不断变化和竞争的加剧,Block仍需保持警惕并持续努力,以应对未来的挑战和机遇。
工控机与PLC的区别并不在于长得什么样子,也不在于使用的工作环境,而在于它们的功能。它就发展来说,它们来自不同的途径,PLC来源以继电器为特征的电气逻辑控制,工控机来源于计算机。早期PLC只能用于进行逻辑运算,现在功能越来越强大了,但总体 ...… 查看全部问答∨ |
我在写基于ucosII任务时,出现这样一个问题。程序如下。这样调用时为什么最终结果LED1,LED2,LED3一直亮任务没有实现抢占调用,但是若把任一个任务注释掉例如//OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);可以实 ...… 查看全部问答∨ |
要做一个函数信号发生器 用凌阳061a 和max038 max038的fadj口调节频率-2.4v到2.4v可调 用061的dac口输出的是0-3mA电流 怎样转换成2.4v到2.4v可调电压 谢谢啦 并诚交电路设计能人异士为好友 如果可能诚心拜师 非诚勿扰 联系邮箱lian.sun ...… 查看全部问答∨ |
|
http://community.eeworld.net/Expert/topic/5500/5500169.xml?temp=.9371149 CeSeekDatabase(g_hDB, CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)&prop,&dwIndex);总返回0,错误码:参数不正确.为什么? 附代码: CEPROPVAL prop ; prop.propid = PID_N ...… 查看全部问答∨ |
|
(一)、关键词密度、布局 关键词布局是当中至关重要的一点,良好的关键词密度和布局是排名敏捷晋升的一个关键,然而怎么的布局更利于搜索? 1、 首先我们看看关键词密度 我以为密度至少也要在3% ...… 查看全部问答∨ |
|
深圳市有方科技GSM/GPRS/3G模块深圳市有方科技M2M团队向业内推出 全球第一款纯数据的GPRS工业级模块 特点: 1,体积小 2,功耗低 3,工作温度低 ============================================================================   ...… 查看全部问答∨ |