AutoSar中的Spi_SetupEB函数原理与实现

一、函数介绍

此函数是Autosar标准中的接口,为EB SPI处理器/驱动程序设置缓冲区和数据长度的服务
指定频道。用容易理解的话说就是 设置一下某个通道的接收数据地址和发送数据地址以及数据长度的函数。

函数原型:
Std_ReturnType Spi_SetupEB ( Spi_ChannelType Channel, const Spi_DataBufferType* SrcDataBufferPtr, Spi_DataBufferType* DesDataBufferPtr, Spi_NumberOfDataType Length )
入参Channel为Channel索引号,索引号在Spi_Cfg.h里有。入参SrcDataBufferPtr为某路Channel的发送数据缓冲区地址,DesDataBufferPtr为某路Channel的接收数据缓冲区地址,Length为数据长度。

二、项目背景

写此函数的背景是目前有一个项目,需要我这边的MCU做SPI从机,SOC做主机与MCU进行SPI通信,并使用AUTOSAR标准接口实现。

三、函数在AUTOSAR官网中的介绍

首先进入到AUTOSAR官网
在这里插入图片描述
在Communication Drivers中即可找到关于SPI相关的介绍,可通过此访问文档
在这里插入图片描述
函数的详细介绍可查看此文档进行了解。了解功能和接口定义实现一个函数基本就足够了。

四、代码实现

根据上面介绍,我们就来实现一下这个接口。并将其应用到SPI从机的代码逻辑功能中。
下面代码是当SPI来数据,SPI从机就会进入到接收中断中进行处理数据,然后将数据放入到Spi_SetupEB中的接收数据DesDataBufferPtr中。

函数实现:

Spi_ChannelObjType Spi_ChannelObj[SPI_MAX_CHANNELS];

typedf struct
{
	Spi_DataBufferType* TxBufPtr;
	Spi_DataBufferType* RxBufPtr;
	Spi_NumberOfDataType numWordsTxRx;
}
Spi_ChannelObjType;

Spi_SetupEB(spi_ChannelType Channel,Spi_DataBufferType *Src,Spi_DataBufferType *Des,Spi_NumberOfDataType Length)
{
	/*关全部中断*/
	Spi_ChannelObjType *chObj;
	chObj = &Spi_ChannelObj[Channel];
	chObj->TxBufPtr = Src;
	ChObj->RxBufPtr = Des;
	ChObj->numWordsTxRx = Length;
	/*开全部中断*/
}

接收中断处理代码

uint8 RxOneData;
void Spi_IrqHandler(spi_ChannelType Channel)
{
	RxOneData = xxxx();//xxxx()代表获取接收SPI数据的函数
	Spi_ChannelObj[Channel].RxBufPtr  = &RxOneData;//将数据给到全局指针中
}

验证测试代码

Spi_DataBufferType  TXEB[10];
Spi_DataBufferType  RXEB[10];
Spi_NumberOfDataType Length = 10;

Spi_SetupEB(0,TXEB,RXEB,Length);//上电后调用一次即可
//待接收中断中收到数据,即存到了EXEB中

五、验证

当调用验证代码,当SPI主机来了数据,RXEB数组中也就存放了接收到的数据。

六、联调过程中遇到的问题

1、字节间纯同步
众所周知,SPI是同步传输的,从机应跟随时钟线进行数据通信,问题是,当主机来了一个字节的数据,从机触发了中断,数据从机收到了,但是,从机的第二个字节的数据是主机第一个字节的数据,导致数据错了一位。
:其实这不是一个问题,是没问题的,因为从机是不可能提前知道主机要给从机发什么数据的,相当于我告诉你我要打你一拳,你是不知道我打你哪里的,这也是相同的道理,不可能提前预知。但是甲方毕竟是甲方,此问题要解决。
**解决办法是:**在应用设置SpiSetupEB接口时,将第一个字节的数据放入到接收数据寄存器中,也就是提前将第一个接收数据寄存器的一个字节放入了主机要发送给我第一个数据,这样就实现数据对齐了。
2、数据错误
在本地调试没有问题,到了项目中调试出现了主机给从机发数据,不过几秒中从机就收不到数据了,经过测试,主机确实给主机发过去了,从机没有进接收中断。
**答:**这是从机MCU产生错误标志,需要将错误状态标志位给清掉之后才能再次进中断接收数据。
解决办法是:
每间隔1ms的时间查询是否产生了错误状态,如果产生了错误状态,连续读四次接收数据寄存器才能彻底清除。然后再清除错误状态寄存器。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Autosar SPI_SetupEB是一个函数,用于设置SPI(Serial Peripheral Interface)传输的扩展缓冲区。SPI是一种常用的串行外设接口协议,用于在微控制器和外部设备之间进行通信。 SPI_SetupEB函数用于配置一个扩展缓冲区,该缓冲区用于在主设备和从设备之间传输数据。通过设置扩展缓冲区的相关参数,可以实现SPI传输的控制和数据传输操作。该函数通常被用于初始化SPI设备,并设置相关的传输参数。 SPI_SetupEB函数的输入参数通常包括SPI设备编号、扩展缓冲区的地址和长度、数据位宽、时钟极性和相位等。通过这些参数的设置,可以控制SPI传输的速度、数据格式和时序等。 在调用SPI_SetupEB函数之后,SPI设备就可以开始进行数据的读写操作。通过SPI接口,主设备可以向从设备发送数据,并接收从设备返回的数据。SPI_SetupEB函数的返回值通常表示设置是否成功,如果设置成功,则返回一个成功的状态,否则返回错误代码。 总而言之,Autosar SPI_SetupEB是一个用于配置SPI传输扩展缓冲区的函数,通过设置相关的参数,可以实现SPI设备的初始化和数据传输操作。使用这个函数,我们可以对SPI进行灵活的控制,实现与外部设备的高效通信。 ### 回答2: SPI_SetupEBAutoSAR的一个函数,用于设置SPI(串行外设接口)的相关参数。 SPI是一种串行通信接口,它允许微控制器与外部设备之间的双向数据传输。SPI接口常用于连接各种外设,如存储器、传感器、LCD显示等。 SPI_SetupEB函数的作用是根据需求配置SPI接口的参数。函数的输入参数通常包括SPI通信模式、时钟频率、数据位宽、传输延迟等。通过设置这些参数,可以满足不同外设的通信要求。 SPI_SetupEB函数实现过程包括以下几个步骤: 1. 判断SPI接口的使用情况,确保有足够的资源进行配置。 2. 根据输入参数,设置SPI接口的通信模式。通信模式包括主从模式和全双工模式。在主从模式,只有一个设备充当主设备,控制通信过程;而在全双工模式,两个设备可以同时发送和接收数据。 3. 设置SPI接口的时钟频率。时钟频率决定了数据传输的速度,需要根据外设的要求进行适当设置。 4. 设置SPI接口的数据位宽。数据位宽决定了每次传输的数据量,一般有8位、16位等选项。 5. 设置SPI接口的传输延迟。传输延迟是指在数据传输过程的延迟时间,需要根据具体应用进行合理设置。 通过SPI_SetupEB函数的调用,可以实现对SPI接口的灵活配置,满足不同外设的通信需求。这有助于提高系统的性能和可靠性,并简化软件开发过程。 ### 回答3: 在AUTOSAR(汽车开放系统架构)spi_setupebSPI_SetupEB)是用于设置SPI(串行外围设备接口)的功能。 SPI_SetupEB是一种接口和函数,用于配置和初始化SPI连接。它允许用户根据实际需求设置SPI的参数,例如数据传输速率、时钟极性、相位和通信模式等。 SPI是一种串行通信协议,常用于连接微控制器和外部设备,例如传感器和存储器。SPI的通信是以主从模式进行的,主设备控制通信并发起数据传输,从设备则被动接收和发送数据。 在使用SPI_SetupEB函数时,用户需要提供相关参数,如SPI通道号、数据传输速率、时钟极性、相位和通信模式等。这些参数将直接影响SPI通信的性能和稳定性。 SPI_SetupEB函数将根据提供的参数进行SPI通信的设置和初始化。它会配置相关寄存器和引脚来实现SPI通信的功能。用户可以使用AUTOSAR提供的函数来调用SPI_SetupEB函数,并根据需要进行参数的配置和调整。 总而言之,SPI_SetupEB函数AUTOSAR用于设置和初始化SPI连接。它是配置SPI参数的重要接口和函数,能够根据用户的需求来进行SPI通信的设置和初始化,以实现稳定和高效的数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值