官方例程的spi问题
spi发送函数
- 下面是S32G两个spi从机发送函数
/**
* @brief SPI/DSPI异步传输。
* 这个函数使用提供的总线参数初始化异步传输
, 通过外部设备。
* @param[in] ExternalDevice -指向传输数据的外部设备的指针
* @param[in] TxBuffer -发送缓冲区的指针。
* @param[in-out] RxBuffer接收缓冲区的指针
* @param[in] Length -发送的字节数。
* @param EndCallback -在传输结束时调用回调函数。
* @return SPI_IP_STATUS_SUCCESS:传输命令已被接受。
* SPI_IP_STATUS_FAIL:传输命令没有被接受。
* @实现Spi_Ip_AsyncTransmit_Activity
*/
Spi_Ip_StatusType Spi_Ip_AsyncTransmit(
const Spi_Ip_ExternalDeviceType *ExternalDevice,
uint8 *TxBuffer,
uint8 *RxBuffer,
uint16 Length,
Spi_Ip_CallbackType EndCallback
);
/**
* @brief SPI/DSPI同步传输。
* 这个函数使用提供的总线参数初始化同步传输
, 通过外部设备。
* @param[in] ExternalDevice -指向传输数据的外部设备的指针。
* @param[in] TxBuffer -发送缓冲区的指针。
* @param[in-out] RxBuffer接收缓冲区的指针
* @param[in] Length -发送的字节数。
* @param[in] TimeOut -发送一个帧的持续时间。
* @return SPI_IP_STATUS_SUCCESS:传输命令已被接受。
* SPI_IP_FIFO_ERROR:溢出或下溢错误发生。
* SPI_IP_STATUS_FAIL:传输命令没有被接受。
* SPI_IP_TIMEOUT:超时错误。
* @实现Spi_Ip_SyncTransmit_Activity
* /
Spi_Ip_StatusType Spi_Ip_SyncTransmit(
const Spi_Ip_ExternalDeviceType *ExternalDevice,
uint8 *TxBuffer,
uint8 *RxBuffer,
uint16 Length,
uint32 TimeOut
);
问题描述
- 如果在发送之前或者任意一个地方改变TxBuffer的值, Spi_Ip_AsyncTransmit发出来的还是数组最开始定义时的值
1. 改初始化的值再重新编译,能发出改过后的值
1. 加了个循环自增,打印看数组有改的,断点暂停看地址也没错,然后继续跑发的第一个是正常改变后的数组,但是继续跑之后发的又不变化了
1. 昨天在nxp论坛问过,他们建议补充文件(SPI_Memmap.h, 在自己工程里发现找不到这个所以暂时注释了,也能跑)和关闭优化,但试了还是一样,并且关优化后片选脚输出没了,目测数据还是没改
1. 只能发全局数组初始化的值,局部数组怎么改都发0
1. 调用状态查看函数,显示每次都成功
1. 如果改变发送的数组,发一个A数组发一个B数组,确实能发对
-
如果换成Spi_Ip_SyncTransmit函数, 改变数组的值是可以成功发出改变值来的, 但这个函数是阻塞式发送, 因为我要配成从机,调用时候好像要等主机,没法再执行其他东西,任务没执行了
-
如果用另一个库,SPI_Transfer那个例程,主机模式下异步发送函数能发对,底层也是调用Spi_Ip_AsyncTransmit,不过前面还有比较多操作,还得研究一下
- 这个库改成从机模式,改了引脚方向,不发东西了,断点看有跑到执行的地方,状态显示busy
官方回复: 例程有误, 需要改宏定义和文件
- 数组没有被正确地定义在非缓存区域
Re: How to change varaibles in array when sending message in spi master/slave mode | S32G274A
#define MCL_START_SEC_VAR_INIT_UNSPECIFIED_NO_CACHEABLE
#include "Mcl_MemMap.h"
uint8 RxBuffer[NUMBER_OF_BYTES];
uint8 TxBuffer[NUMBER_OF_BYTES] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
#define MCL_STOP_SEC_VAR_INIT_UNSPECIFIED_NO_CACHEABLE
#include "Mcl_MemMap.h"
- 部分解释, 但现象和宏定义的功能好像还有点出入, 可研究下非缓存区域