历史上的今天
返回首页

历史上的今天

今天是:2025年01月16日(星期四)

正在发生

2019年01月16日 | stm32作为spi的从机使用例程

2019-01-16 来源:eefocus

STM32的SPI可以作为master,也可以作为slave,作为slave的例程比较少,今天经过几个小时的折腾,终于把数据获取出来了,经验证和元数据是一致的。现将源代码贴在这里,供有需要的人参考。

 

硬件连接:

STM32(作为从设备)    外部设备

PB12-SPI2-NSS------------>  CS

PB13-SPI2-SCK------------->CLK

PB14-SPI2-MISO----NC

PB15_SPI2-MOSI----------->data

 

STM32作为从设备的时候,获取数据的接口为MOSI(PB15),STM32只需要从SPI接口获取数据,不需要发送数据,因此MISO(PB14)悬空。


//SPI2作为从机接口配置

void SPI_slave(void) 

    GPIO_InitTypeDef GPIO_InitStructure; 

    SPI_InitTypeDef SPI_InitStructure;

    NVIC_InitTypeDef   NVIC_InitStructure; 

    

    //Enable SPI2 clock and GPIO clock for SPI2 and SPI 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); 

    //IO初始化 

    

    //Configure SPI2 pins: SCK, MISO and MOSI 

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12|GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 

    GPIO_Init(GPIOB, &GPIO_InitStructure); 

 

 

    //1st phase: SPI2 slave 

    //SPI1 Config 

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;//只接收,不发送,这个地方是重点,如果设置为单工通信是不能实现数据采集的。

    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //从机模式

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //数据位为8

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //不发送数据时,时钟线为高

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //在第二个沿进行采样

    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; //硬NSS

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; 

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //MSB优先

    SPI_InitStructure.SPI_CRCPolynomial = 7; 

    SPI_Init(SPI2, &SPI_InitStructure); 

 

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //使用中断进行接收,因此设置NVIC的优先机组,1表示1bit抢占优先级

    

    NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn; 

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; 

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure); 

    

    /* Enable SPI2 RXNE interrupt */    

    SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE); 

 

    //Enable SPI2 

    //SPI_Cmd(SPI2, ENABLE); //先不启动SPI,在收到特定命令的时候再启动


//中断服务程序

void SPI2_IRQHandler(void) 

    //接收数据 

    //printf("SPI_IRQ %d\n",RxIdx);

    SPI2_Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI2);

 

 

int main(void)

{  

    int i;

SystemInit(); /* 配置系统时钟为 72M */   

LEDKEY_GPIOInit();

USART_GPIOInit();

SysTick_Configuration();

USART_Configuration(USART1, 9600);

SPI_slave(); 

LED1_ON;

  while (1)

  {

     if(RxIdx==50)//接收数据满,对数据进行处理

     {

        SPI_Cmd(SPI2, DISABLE);

        RxIdx=0;

        printf("rcv full\n");

        for(i=0;i<49;i++)

           printf("0x%02X\n ",SPI2_Buffer_Rx[i]);//串口输出获取的数据

     }

     if(GetKey()==1)

{

LED1_ON;

         SPI_Cmd(SPI2, ENABLE);//按键按下后,使能SPI2,然后在中断中接收数据

         RxIdx=0;//接收数据下标清零

         printf("key1\n");

}

if(GetKey()==2)

{

LED1_OFF;

}

 

  }

}


推荐阅读

史海拾趣

长江连接器(CJT)公司的发展小趣事

长江连接器(CJT)公司自创立之初,就致力于电子连接器的研发、生产和销售。公司凭借对连接器技术的深入研究和理解,不断积累技术经验,逐渐在连接器领域建立了自己的技术壁垒。在初创阶段,长江连接器就注重产品质量和技术创新,通过引进先进的生产设备和技术人才,不断提高产品的性能和可靠性。

Excelight Communications Inc公司的发展小趣事

随着5G技术的兴起,光通信行业迎来了新的发展机遇。Excelight紧跟时代步伐,投入大量资源进行技术研发。在李明和团队的共同努力下,公司成功研发出了一款具有自主知识产权的高速光通信芯片,这一成果不仅填补了国内空白,还使Excelight在国际市场上占据了有利地位。

技术突破后,Excelight的产品性能得到了显著提升,同时也带动了整个产业链的升级。公司开始与更多的国内外企业建立合作关系,共同推动光通信行业的发展。

Embedded Artists公司的发展小趣事

Embedded Artists公司成立于2000年,创始人是一群热衷于嵌入式技术的瑞典工程师。他们看到了嵌入式技术在未来电子产品中的巨大潜力,决定成立一家公司,专注于基于恩智浦处理器的嵌入式解决方案的研发和生产。公司初期面临资金紧张、市场认可度不高等挑战,但他们凭借对技术的热情和不懈的努力,逐渐在行业中树立了口碑。

DETCO公司的发展小趣事

为了进一步拓展全球市场,ElectronicsCorp制定了国际化战略。公司先后在北美、欧洲和南美等地设立了研发中心和生产基地。这些海外机构不仅为ElectronicsCorp提供了更广阔的市场空间,还使其能够更深入地了解不同地区的消费者需求和文化背景。通过本土化战略的实施,ElectronicsCorp逐渐在海外市场取得了成功。

聚洵(Gainsil)公司的发展小趣事

在电子产品行业日益关注环保和可持续发展的背景下,ElectronicsCorp采取了一系列积极措施。公司开始使用环保材料制造产品,并优化生产流程以减少能源消耗和废物排放。此外,ElectronicsCorp还推出了一系列回收计划,鼓励消费者将旧电子产品回收再利用。这些措施不仅提高了公司的环保形象,还增强了消费者对公司品牌的忠诚度。

ADMOS公司的发展小趣事

随着技术的不断进步,ADMOS公司开始积极拓展国内外市场。通过与各大电子设备制造商建立紧密的合作关系,ADMOS的产品逐渐渗透到智能手机、平板电脑、笔记本电脑等消费电子产品中。同时,公司还积极开拓汽车电子、工业控制等新兴市场,为公司的持续成长注入了新的动力。

问答坊 | AI 解惑

请教在路测量电阻

我在电路板上焊了个15K的贴片电阻,电路运行一段时间后,在短电测量该电阻时,发现该电阻值变为3.6K了,不知道是怎么回事,有些电阻值是对的,可有些出现了很大的偏差,不知道是不是在路测量不准确啊…

查看全部问答>

一个电子工程师的经验之谈!

这是“工控论坛”中的一个精彩帖子,是版主“totopper ”的帖子,推荐给“单片机”论坛的朋友们看一看! 一个电子工程师的经验之谈 “工程师是科学家;工程师是艺术家;工程师也是思想家。”一位伟大的工程师曾经提出过这样的一段感言。不错,工 ...…

查看全部问答>

ARM嵌入式系统设计基础教程课件

ARM嵌入式系统设计基础教程课件…

查看全部问答>

使用CCS进行DSP编程.rar

使用CCS进行DSP编程.rar 三个pdf文件,主要是讲CCS的…

查看全部问答>

用vs2005的.net compact framework2.0开发Wince程序的问题,急!

我用vs2005开发的wince项目,在pc机上可以运行,但放到开发板上之后运行程序则出现Not Supported Exception,我使用了泛型类List,这个类在mscorlib.dll库中,但设备的windows目录下没有这个库,不知道是为什么,裁剪系统时已经加入了.net 2.0的支 ...…

查看全部问答>

请教关于evc中sizeof()函数的问题

大哥大姐们好!小弟这儿有礼了!一定给分!   我在写一个读取串口的程序,但是在其中的sizeof()函数中遇到了问题。当要向串口写数据时,我使用了函数   fWriteStat = WriteFile(hCom, lpBuf, sizeof(lpBuf),&dwHaveNumWritten,NULL);    ...…

查看全部问答>

基于SEED-DIM3517的平板电脑

基于SEED-DIM3517的平板电脑…

查看全部问答>

STM8S关于Vcap问题

STM8S关于Vcap问题: 如果我用的是3,3V系统,那我在Vcap上可以悬空或者把Vcap脚直接接到电源上吗?…

查看全部问答>

有什么办法能判断USART正在发送一个字节?

我说的“正在发送”是指TXD引脚上正在向外移位数据。 状态寄存器里好像没有哪个位能代表这种状态。…

查看全部问答>

问局部变量的地址分配问题

我用IAR3。2,F149的芯片,编程时在定时中断中定义了一个局部变量,硬件仿真时在WATCH窗口中观察此变量有一个初值102(我定义时没复初值),变量地址(LOCATION)被分配为0X9,有时又被分配为0XB,请问高手这个0X9或0XB是指哪的地址,我在MEMORY窗口中 ...…

查看全部问答>