1.新增pins
2.检查时钟
3.添加DMA配置
- 配置Tx DMA通道
- 配置CMD DMA通道
- 配置Rx DMA通道
4.添加SPI设备
5.添加中断
- 允许中断,设置优先级
- 中断回调函数
7.初始化和中断代码
- 有关发送接收数组的一些问题参考S32G274A spi发送数组值不变问题
// 初始化
void SPI1_Init()
{
/* Initialize each Spi hardware units using*/
Spi_Ip_Init(&Spi_Ip_PhyUnitConfig_SpiPhyUnit_1_VS_0);
/* Update Framesize */
Spi_Ip_UpdateFrameSize(&Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0, 8U);
/* Update Transfered Bit order */
Spi_Ip_UpdateLsb(&Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0, FALSE);
/* Update Transfer Mode */
Spi_Ip_UpdateTransferMode(Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0.Instance, SPI_IP_INTERRUPT);
}
// 中断回调函数
void Spi1_Ipw_Callback()
{
memcpy(rxmsg.buff,RxPtr,21); // 接收到数据
// 处理接收的数据
memcpy(TxPtr,SPI_Tx_msgbuff,21);
Spi_Ip_AsyncTransmit(&Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0, TxPtr, RxPtr, SPI_TxRx_Length, &Spi1_Ipw_Callback);
}
// 首次发送, 从机配置时, 要一开始先调用一次发送, 这样s32g才会等待主机CS并触发中断
void App_Spi1_SendFirst()
{
App_SPI_data_init();
TxPtr = (uint8 *)malloc(21);
RxPtr = (uint8 *)malloc(21);
memcpy(TxPtr,SPI_Tx_msgbuff,21);
memcpy(RxPtr,Rx_SPI_Buffer,21);
Spi_Ip_AsyncTransmit(&Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0, TxPtr, RxPtr, SPI_TxRx_Length, &Spi1_Ipw_Callback);
}
注意
const Spi_Ip_ConfigType Spi_Ip_PhyUnitConfig_SpiPhyUnit_1_VS_0 =
{
1U, /* Instance */
// ......
};
-
文件
Spi_Ip_VS_0_PBcfg.c
这里, 设备号可能需要手动改, 目前还不清楚外设中哪一个是改这个的, 如果有大佬知道麻烦评论告知🤗🤗; -
之前使用了spi3和spi1, 结果两个
Spi_Ip_PhyUnitConfig_SpiPhyUnit_1_VS_0
的这个值都是3, 运行进入了DEV_ASSERT.c
, 改了这个值才正常运行, -
每次生成可能会覆盖, 要手动改一下