瑞萨RH850 ---P1M-C 1374的SPI问题

这里先直接说下自己遇见的问题-------------- 先简单介绍下,硬件分部 是我使用了4个从机;和自身的MCU 1374做主机;

都使用CS--片选进行控制;现象是SPI(1)读写操作都能接收到(2)上电后第一帧回的不对,程序复位一下就对了(3)写不进去:写完再读回的数据和直接读一样(4)回的数据中寄存器地址有时候会错误  。

下面是我使用autostar的达芬奇软件进行的配置

这里对配置配置项做下简单说明。根据手册

我们这里对SPI的autostar做简单的介绍

SpiDriver

SpiDriver中需要配置时钟,其他都是自动生成的
cfg中配置:

SpiChannel

SpiChannelId

Autosar标准配置项,一般为自动生成
cfg中配置:

SpiChannelType

选择通道类型,IB/EB
cfg中配置:

SpiDataWidth

该参数表示传输数据单元的宽度。需要根据实际通信需求修改。
cfg中配置:

SpiDefaultData

当(对于内部缓冲区或外部缓冲区)传递给Spi_WriteIB(对于内部缓冲区)或Spi_SetupEB(对于外部缓冲区)的指针为NULL时,传输的默认数据


cfg中配置:

SpiEbMaxLength

在选择为EB通道的情况下,此参数仅包含数据缓冲区的最大大小(数据元素数量)。

依赖项:SPI_CHANNEL_TYPE参数必须为该通道配置为EB。
SPI_CHANNEL_BUFFERS_ALLOWED参数必须配置为1或2
cfg中配置:

SpiIbNBuffers

该参数用于设置IB模式下的最大数据缓冲区数量
依赖项: SPI_CHANNEL_TYPE参数必须为该通道配置为IB。SPI_CHANNEL_BUFFERS_ALLOWED参数必须配置为0或2
此处我们没有选择用IB,所以不用配置该项

SpiTransferStart

此参数定义传输的第一个起始位。LSB-低位先传输,MSB-高位先传输。具体选择哪种需要看具体的应用场景。
cfg中配置:

SpiExternalDevice

通信外部设备的设置。与SpiJob密切相关,会被SpiJob引用。

SpiBaudrate

配置波特率。
cfg中配置:

SpiAutoCalcBaudParams

此配置不是Autosar标准配置。用来启用或不启用qspi波特率参数的自动计算。如果参数设置为TRUE,则配置工具将根据参数SpiBaudrate自动生成波特率参数(TQ、Q、A、B、C)。该项配置后,TQ、Q、A、B、C可以不配置。
cfg中配置:

SpiCsIdentifier

此参数是标识分配给该Job的Chip Select (CS)的符号名称。

此处CS信号我们没有选择在SPI中配置,而是直接通过配置PORT实现。
所以该配置不需要配。

SpiCsPolarity

配置片选信号的激活时的电平。
cfg中配置:

SpiCsSelection

当芯片选择处理被启用时(参见SpiEnableCs),那么这个参数指定芯片选择是由外设HW引擎自动处理还是通过Spi驱动程序的通用IO处理

一般都会选择CS_VIA_PERIPHERAL_ENGINE,除非对应的IO被异常占用。
cfg中配置:

SpiDataShiftEdge

此参数定义SPI数据移位边缘。数据可以在移位时钟的前沿或后沿上移位 对于一个时钟周期内,有两个edge,分别称为:
(1)Leading edge=前一个边沿=第一个边沿,对于开始电压是1,
那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候;
(2)Trailing edge=后一个边沿=第二个边沿,对于开始电压是1,
那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1), 对于开始电压是0,那么就是1变成0的时候
在SPI协议中,有类似的定义为CPHA
CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位
不太一样的是,SpiDataShiftEdge是指的数据传输,CPHA指的是数据采样。不过一个确定后,另外一个边沿也就跟着确定了。

cfg中配置:

SpiEnableCs

启用或禁用Chip Select处理功能。如果该参数被启用,那么参数SpiCsSelection进一步详细说明了芯片选择的类型
cfg中配置:

SpiIdleTime

此参数是QSPI硬件定义的IDLEA/IDLEB时间(以秒为单位)。此参数用于计算Qspi硬件延迟参数IPRE和IDLE。参数的单位为秒。
该配置需要参考具体的外设使用
cfg中配置:

SpiParitySupport

当选择SpiParitySupport时,SPI数据传输/接收包含一个额外的位,使奇偶校验基于选择为偶数EVEN或奇数ODD。此处我们没有使用该功能
cfg中配置:

SpiShiftClockIdleLevel

此参数定义SPI移位时钟空闲电平,在SPI中一般又称为极性CPOL
CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性


cfg中配置:

SpiTimeClk2Cs

时钟和芯片选择CS之间的计时(以秒为单位),在英飞凌手册中也称为leading delay-此参数允许使用从0到0.0001秒的值范围。该配置需要参考具体的外设使用
cfg中配置:

SpiTrailingTime

此参数是QSPI硬件定义的Trailing时间(以秒为单位)在英飞凌手册中也称为trailing delay。该参数用于计算Qspi硬件延迟参数TPRE和TRAIL。该配置需要参考具体的外设使用
cfg中配置:

延时时间参数可以参考寄存器BACON中的对应位。

SpiHwUnit

配置对应的硬件单元,该配置需要跟实际原理图对应起来。

SpiJob

SpiJobEndNotification

此参数是通知函数的引用。如果配置了Notification,则在job结束后会调用对应的函数


cfg中配置:

SpiJobId

一般自动生成该ID。
cfg中配置:

SpiJobPriority

根据SPI093设置优先级:0,最低,3,最高优先级
cfg中配置:

SpiDeviceAssignment

关联对应的 external device
cfg中配置:

SpiHwUnitSynchronous

配置job是同步还是异步

SpiChannelList

配置job中的channel,一个job至少有一个channel

SpiSequence

SpiInterruptibleSequence

此参数允许或不允许此序列被另一个序列挂起。依赖:这个SPI_INTERRUPTIBLE_SEQ_ALLOWED参数被配置为ON。
cfg中配置:

SpiSeqEndNotification

此参数是通知函数的引用。


cfg中配置:

SpiSequenceId

一般自动生成此参数
cfg中配置:

SpiJobAssignment

配置关联的job
cfg中配置:

SpiGeneral

SpiAsyncParallelTransmit

用于启用/禁用仅在Level 1和Level 2可编辑的并行异步传输

通过启用SpiAsyncParallelTransmit,限制适用于Autosar的使用。

Sequence不能包含属于不同QSPI模块的Job。
这个配置没用过
cfg中配置:

SpiBaudrateConfigAtRuntime

波特率配置选择是在Spi_Init()还是在运行时启动new job之前,一般不勾选
cfg中配置:

SpiCancelApi

选择是否开启Spi_Cancel()函数,该函数用来取消指定的正在进行的序列传输。


cfg中配置:

SpiChannelBuffersAllowed

选择允许和传递的SPI处理器/驱动程序通道缓冲区使用情况

如果通道使用IB,则选择0,如果通道使用EB,则选择为1,若两种都有使用,则选择2

cfg中配置:

SpiHwStatusApi

选择是否开启Spi_GetHWUnitStatus函数,此函数返回指定SPI硬件微控制器外围设备的状态


cfg中配置:

SpiInterruptibleSeqAllowed

打开或关闭可中断序列处理功能
SPI_LEVEL_DELIVERED需要配置为1或者2,sequence中也有对应的配置SpiInterruptibleSequence


cfg中配置:

SpiLevelDelivered

SpiLevelDelivered为0(LEVEL0):驱动程序仅处理所有可用SPI总线(QSPIx)上的简单同步传输
SpiLevelDelivered为1(LEVEL1):驱动程序仅处理所有可用SPI总线(QSPIx)上的简单异步传输
SpiLevelDelivered是2级(LEVEL2):LEVEL2是驱动程序的增强行为,将处理同步和异步传输
一般都配置为2
cfg中配置:

SpiMaxJobTriggerQueueLength

队列中job的最大个数
cfg中配置:

其他配置项不是很重要,默认即可

SpiHwConfiguration

配置SpiHwDmaConfiguration,即对应的发送和接收的DMA通道
TC27x有四路QSPI

记得在MCU中将DMA选择为SPI USE

SPI使用

此处我们SPI使用异步调用,中断方式。需要在OS中配置DMA,SPI的相关中断。
在EcuMDriverInitListOne中增加Spi_Init函数
在需要使用SPI的外设驱动CDD的初始化函数中,调用:

 Spi_SetAsyncMode(SPI_ASYNC_MODE_INTERRUPT);

通过Spi_SetupEB函数设置发送和接收的数据,然后通过Spi_AsyncTransmit函数发送Sequence

对于Spi_SetupEB函数,使用方法如下:

Std_ReturnType Spi_SetupEB (

  Spi_ChannelType Channel,

  const Spi_DataBufferType* SrcDataBufferPtr,

  Spi_DataBufferType* DesDataBufferPtr,

  Spi_NumberOfDataType Length

)

---------------------------------------------------------------------------------------------------------------------------------

我发现每个通道 只能使用一路SS 这样数据才能正确,而且必须是CHIH0CSS0;CHIH1CSS1;CHIH2CSS2; CHIH3CSS3;  这种选择,于是我在port上选择时候 ---我只单独选择 上面这四种通道和片选。--------------数据终于正常了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值