S32K3 MCAL配置 【LPSPI】
1、需求分析
目标在s32k344板子上实现spi异步收发,不使用DMA
2、SPI功能介绍
2.1 硬件介绍
K3系列MCU具有6个独立的SPI模块,序号为SPI0-5,其特征为:
高性能的SPI0在回环模式下支持20M速率,普通模式15M;其他SPI模块在选择增强型引脚的条件下,支持最大15M速率。
2.2 时钟配置
高型能的SPI0以外设桥平台时钟
AIPS_PLAT_CLK为总线时钟源,其他SPI以AIPS_SLOW_CLK作为总线时钟源;
2.3 SPI通信模式与时序
根据时钟极性CPOL与时钟相位CPHA的组合,SPI总共有4种不同的通信模式。其中,时钟极性规定空闲时SPI同步时钟线的电平,时钟相位决定数据从移位寄存器移出到总线的边沿与采样边沿。
左图显示了当时钟相位CPHA为0时,采样边沿为奇数边沿,如SCK时钟第1,3边沿;当CPHA为1时,采样边沿为偶数边沿,如第2,4边沿;
2.4 TODO
连续传输,半双工,FIFO等模式暂未使用,后续再添加
3、MCAL配置
3.1 时钟配置
LPSPI外设时钟使能,重要!!!
3.2 Port配置
1、CS引脚
1、SCK引脚
1、MISO引脚
1、MOSI引脚
3.3 SPI配置
spi的几种特性
1、使能EB和IB
2、使能异步和同步
1、SPI0
2、选择主机模式
3、选择时钟源
1、EB
2、数据宽度
1、波特率
2、片选序号
3、片选传输时的极性
4、数据传输时的极性
1、Job优先级
4、代码调试
int main(void)
{
boolean Result = TRUE;
Spi_SequenceType SeqStatus;
uint32 Count = 0xFFFFFF;
uint8 Index;
/* Initialize the Mcu driver */
Mcu_Init(NULL_PTR);
Mcu_InitClock(McuClockSettingConfig_0);
#if (MCU_NO_PLL == STD_OFF)
while ( MCU_PLL_LOCKED != Mcu_GetPllStatus() )
{
/* Busy wait until the System PLL is locked */
}
Mcu_DistributePllClock();
#endif
Mcu_SetMode(McuModeSettingConf_0);
/* Install interrupt handlers using the Platform driver */
Platform_Init(NULL_PTR);
/* Initialize all pins using the Port driver */
Port_Init(NULL_PTR);
Spi_Init(NULL_PTR);
Spi_SetAsyncMode(SPI_INTERRUPT_MODE);
/* Set up external buffer to transmission and reception */
Spi_SetupEB(SpiConf_SpiChannel_SpiChannel_0, TxMasterBuffer, RxMasterBuffer, 10u);
Spi_SetupEB(SpiConf_SpiChannel_SpiChannel_1, TxSlaveBuffer, RxSlaveBuffer, 10u);
/* setup SLAVE sequence */
Spi_AsyncTransmit(SpiConf_SpiSequence_SpiSequence_Slave);
/* setup MASTER sequence */
Spi_AsyncTransmit(SpiConf_SpiSequence_SpiSequence_Master);
do
{
SeqStatus = Spi_GetSequenceResult(SpiConf_SpiSequence_SpiSequence_Master);
Count--;
}
while ((Count > 0u) && (SeqStatus != SPI_SEQ_OK));
if (0u == Count)
{
Result = FALSE;
}
Count = 0xFFFFFF;
do
{
SeqStatus = Spi_GetSequenceResult(SpiConf_SpiSequence_SpiSequence_Slave);
Count--;
}
while ((Count > 0u) && (SeqStatus != SPI_SEQ_OK));
if (0u == Count)
{
Result = FALSE;
}
/* Verify data after transfer from MASTER to SLAVE */
for (Index = 0; Index < 10; Index++)
{
if (TxMasterBuffer[Index] != RxSlaveBuffer[Index])
{
Result = FALSE;
break;
}
}
Exit_Example(Result);
}
异步中断主从通信,完成