datasheet

DSP2808与ARM STM32F103的SPI通讯例程及详解

2019-07-11来源: eefocus关键字:DSP2808  ARM  STM32F103  SPI通讯

本程序经验证可实现DSP和ARM的SPI通讯。 

一、 SPI的通信协议 

SPI(Serial Peripheral Interface)是一种串行同步通讯协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而完成数据的交换。SPI 接口一般由4根线组成,CS片选信号(有的单片机上也称为NSS),SCLK时钟信号线,MISO数据线(主机输入从机输出),MOSI数据线(主机输出从机输入),CS 决定了唯一的与主设备通信的从设备,如没有CS 信号,则只能存在一个从设备,主设备通过产生移位时钟信号来发起通讯。通讯时主机的数据由MISO输入,由MOSI 输出,输入的数据在时钟的上升或下降沿被采样,输出数据在紧接着的下降或上升沿被发出(具体由SPI的时钟相位和极性的设置而决定)。 

 这里写图片描述 

串行协议框图 

二、 例程 

DSP TMS320F2808PZA做主机,ARM STM32F103VCT6做从机实现两芯片的SPI通讯。 

1、 ARM从机例程。 

ARM使用SPI1且工作于从模式。从机的SPI一直都是处于等待状态,一旦主机有数据发送过来,从机立即进入中断进行接收。接收数据的同时也向主机发送数据。


void SPI_Init_user(void)          //SPI1配置函数

{

  SPI_InitTypeDef  SPI_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

  /* 使能 GPIOA 时钟 */  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

  /*SPI1外设时钟开 */  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

 /*引脚配置*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出,复用模式的输入输出由程序决定。

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* SPI1 工作方式配置 */

  SPI_Cmd(SPI1, DISABLE);   //配置前先关闭SPI

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //全双工工作模式。

  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;      //设置SPI1为从模式。

  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;  //数据位16位

  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;  //空闲时刻为高,DSP那边也设为高。

  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //时钟相位,数据在第2个跳边沿被采集

  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;     //CS引脚为软模式,即通过程序控制片选脚。 

  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;  //256分频为波特率,因为波特率是由主机提供的。所以在这里设置没有意义。

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//先传高字节,因为DSP只有高字节传送这种方式,所以这里要设置为高字节在前。不然就乱了。

  SPI_InitStructure.SPI_CRCPolynomial = 7;  //CRC多项式不设置,默认。

  SPI_Init(SPI1, &SPI_InitStructure);


  SPI_Cmd(SPI1, ENABLE);   /* 使能 SPI1  */

  SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); //接收缓冲区数据非空中断,开启接收中断。

}

中断优先级配置

void NIV(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);     

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;      //SPI1通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //子优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //通道使能

NVIC_Init(&NVIC_InitStructure);   

}

中断服务程序

void SPI1_IRQHandler(void)                  //SPI中断服务程序

    {

static u16 b=0;     

     OSIntEnter();    //有UCOS操作系统时加上这条 

GPIO_SetBits(GPIOE,  GPIO_Pin_5);   //只是一个指示灯,做测试用

 if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_RXNE) == SET)  // 接收区数据非空

 { 

  SPI_I2S_ClearITPendingBit( SPI1 , SPI_I2S_IT_RXNE ) ;  //清标志位

      rdata_SPI[b]=SPI_I2S_ReceiveData(SPI1);              //接收数据,放在rdata_SPI。

  SPI_I2S_SendData(SPI1, sdata[b]);                    //   发送数据

b++;

 if(b==16)b=0;

}  

    OSIntExit();    //有UCOS操作系统时加上这条             

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

2、 DSP主机例程。 

DSP使用SPIA且工作于主机模式。使用定时发送的方式给从机发数据。 

SPIA_GPIO引脚初始化


void InitSpiaGpio()

{

    EALLOW;

    GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)   GPIO16设置为异步脚

    GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)   GPIO17设置为异步脚

    GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)    GPIO18设置为异步脚

    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)     GPIO19设置为异步脚


    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA   配置GPIO16为SPI_SIMO

    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA   配置GPIO17为SPI_SOMI

    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA    配置GPIO18为SPI_CLK

    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA     配置GPIO19为SPI_STE(NSS 或CSS)

    EDIS;

}

SPI_FIFO初始化

void spi_fifo_init(void)

{

    SpiaRegs.SPIFFTX.all=0xE040;   //使能SPIFIFO功能;TXFIFO复位;清除 TXFF INT 中断位;TXFIFO 中 断不使能;

    SpiaRegs.SPIFFRX.all=0x204f;   //重新使能接收 FIFO 操作;清RXFIFO中断标志位;中断不使能。

    SpiaRegs.SPIFFCT.all=0x0;      //这个寄存器是设置FIFO延时的,不需要用到。

}

SPI工作方式配置

void spi_init(void)

{

    SpiaRegs.SPICCR.all =0x004F;       // 复位,下降沿发送,上升沿接收(即时钟极性是:空闲时为高电平),  字长16位。关闭SPI内部LOOP BACK  禁止回送

    SpiaRegs.SPICTL.all =0x0006;    // 主机模式, 时钟相位为正常相位, SpiaRegs.SPICTL.bit.CLK_PHASE=0;

                               //TALK=1使能主机发送, SPI中断不使能.  时钟相位为:数据在第2个时钟边沿被选择

    SpiaRegs.SPIBRR =0x007F;      //波特率=195.3KHz 。波特率=LSPCLK/(SPIBRR+1)=25MHz/128=195.3KHz

    //SpiaRegs.SPIBRR=24;          //Baud=25M/(24+1)=1M  波特率太大的话,SCK只有一个脉冲出来

SpiaRegs.SPICCR.all =0x00CF;       //下降沿发送,上升沿接收(即时钟极性是:空闲时为高电平), 字长16位。准备发送或接收  禁止回送模式SPILBK=0

 SpiaRegs.SPIPRI.bit.FREE = 1;    //仿真用的

}

在主程序中定时500ms向从机发送数据,时间可由自己定。即每500ms调用下面函数一次。

void SPI_service()

{

          int16 j,tmp;

         sdata[0]=0x0c;                  //数据帖头

     sdata[1]=TEMP;                //温度采样值发去ARM显示

     for ( j=0;j<16;j++ )

     {

         tmp=sdata[j];

         SpiaRegs.SPITXBUF=tmp;        //发送数据

       while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }  //接收FIFO为空时,等待!

       // 检查返回数据

       rdata_SPI[j] = SpiaRegs.SPIRXBUF;

       if(rdata_SPI[1]==0x0c)   //收到正确的帖头

       {

             for(h=0;h<16;h++)

               {

               rdata[h]=rdata_SPI[h];

               }

       }

   }

    }



关键字:DSP2808  ARM  STM32F103  SPI通讯

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic467465.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32通过io模拟SPI与ADC124S021通信
下一篇:arm底层通讯协议之SPI通讯

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

辰芯科技获得CEVA DSP授权

CEVA,全球领先的智能和互联设备信号处理平台和人工智能处理器IP授权许可厂商 (纳斯达克股票交易所代码:CEVA) 宣布中国信息通信科技集团 (CICT)旗下子公司辰芯科技有限公司(MorningCore Technology Co. Ltd)已经获得授权许可,在其软件定义无线电(SDR)处理器和平台系列中部署使用CEVA-XC DSP,瞄准高性能4G/5G无线和蜂窝网络车到一切(C-V2X)应用。 CICT是专注于电信领域创新研发的高科技企业集团。成立于2017年的辰芯科技有限公司是大唐集团的一部分,是CICT旗下重要企业,负责集成电路(IC)和系统级芯片(SoC)的开发和创新,以推动实现5G终端
发表于 2019-06-27

东芝选用Cadence Tensilica Vision P6 DSP 提高ADAS芯片的图像识别性能

(图片来源:Cadence官网)据外媒报道,东芝为其下一代汽车SoC选用Cadence Tensilica Vision P6 DSP IP,以满足功能安全要求。该数字信号处理器IP具有计算吞吐量高、功耗低、芯片核心区小的特点。此外,它已通过认证,能满足汽车应用的典型功能安全要求。Cadence表示,Vision P6 DSP的功效效率比CPU高3.8倍,处理能力高达 1024 GOPS,可作为卸载引擎,有效处理视觉和AI工作负载,满足精确检测和识别目标需求。Tensilica生态系统是东芝选择的决定性因素。这家日本芯片制造商已将Cadence Xtensa Imaging Library
发表于 2019-06-25
东芝选用Cadence Tensilica Vision P6 DSP 提高ADAS芯片的图像识别性能

Cadence推Tensilica Vision Q7 DSP 为汽车提供双倍的视觉和AI性能

(图片来源:Cadence官网) 据外媒报道,Cadence Design Systems推出新的Tensilica Vision DSP,用于高要求的边缘视觉和AI处理应用,可每秒执行高达1.82万亿次操作(TOPS)。Cadence Tensilica Vision Q7 DSP是该公司Tensilica Vision DSP系列的一个扩展,据称可以将汽车、AR/VR、移动和监测市场的视觉和AI能提高一倍。该公司表示,第六代Vision Q7 DSP在相同的领域提供了高达2倍的AI和浮点性能,满足了嵌入式视觉和AI应用日益增长的计算需求。Vision Q7 DSP IP是专为同步定位和映射(SLAM)而优化
发表于 2019-06-15
Cadence推Tensilica Vision Q7 DSP 为汽车提供双倍的视觉和AI性能

智能耳戴式设备或将成为智能手表强有力的竞争对手

不同的声音类型,例如火车进站,并且可以剔除噪音。如果他们确实做到了这一点,那么我们离真正的噪音消除就近了一大步,这款产品也一定会大受欢迎。 另一个应用示例是探测头部动作以支持3D音效,用于3D音乐体验或游戏。当你移动或行走时,你听到的声音会根据你所在的场景而变化,从而创造出更逼真的VR体验。如果你在玩游戏,当你转动头部时,你不只会看到场景转换,你听到的声音也会随之变化。 那么是什么让这一切成为可能呢?显然,入耳/头戴式耳机的计算和通信能力必须大幅提高,通信必须做到真正无线,如果无法摆脱传统的连接线,那么这一切将毫无意义。你至少需要与手机建立蓝牙连接,并且在耳机中呈现出卓越的音质。这两种功能都需要借助DSP来实现
发表于 2019-05-24
智能耳戴式设备或将成为智能手表强有力的竞争对手

汽车音频工程师的DSP开发方法论

汽车音频系统噪音与便携式设备不同,车载音响系统配有高功率放大器,每个功放能够提供高达40 W-50 W功率,每辆汽车至少有四个扬声器。由于功率较大, 噪底很容易被放大,使得人耳在安静的环境下就能感受到。使用SigmaDSP,可以有效减少汽车音频系统因高功率而产生的噪音,同时不增加系统成本。 ADAU1401是SigmaDSP产品系列的一员,包含完全可编程的28/56位音频DSP、ADC、DAC及类似微控制器的控制接口。这里以该款器件为例,讲解如何利用SigmaDSP减少汽车音频系统噪音。 下图是一个4扬声器车载音响系统的框图,其中ADAU1401 SigmaDSP处理器用作音频后处理器。除了采样、转换、音频
发表于 2019-03-26
汽车音频工程师的DSP开发方法论

华为已在欧洲给鸿蒙OS提交了商标申请:Harmony

      据gsmarena消息,华为已向欧盟知识产权局(European Union Intellectual Property Office)提交商标申请,申请对象为华为移动和电脑操作系统鸿蒙OS,申请商标为“Harmony”,申请日期为2019年7月12日,目前正在审核中。而之前的“Ark”,将作为的华为公司操作系统“Harmony”在全球市场上的代号。  据华为董事长梁华表示,鸿蒙系统是为物联网开发的,用于自动驾驶、远程医疗等低时延场景。华为手机还是把开放的安卓系统和生态作为首选,如果美国不允许华为使用安卓,华为是否会把鸿蒙发展为手机系统,还没有确定。
发表于 2019-07-15

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved