uint32_t dspiSourceClock;
uint32_t calculatedBaudRate;
dspi_device_t masterDevice;
dspi_status_t dspiResult;
dspi_master_state_t masterState;
dspi_master_user_config_t masterUserConfig = {
.isChipSelectContinuous = true,
.isSckContinuous = false,
.pcsPolarity = kDspiPcs_ActiveLow,
.whichCtar = kDspiCtar0,
.whichPcs = kDspiPcs1
};
configure_spi_pins(SPI1_IDX);
// Setup the configuration.
masterDevice.dataBusConfig.bitsPerFrame = 8;
masterDevice.dataBusConfig.clkPhase = kDspiClockPhase_FirstEdge;
masterDevice.dataBusConfig.clkPolarity = kDspiClockPolarity_ActiveHigh;
masterDevice.dataBusConfig.direction = kDspiMsbFirst;
// Initialize master driver.
dspiResult = DSPI_DRV_MasterInit(1,
&masterState,
&masterUserConfig);
if (dspiResult != kStatus_DSPI_Success)
{
}
// Configure baudrate.
masterDevice.bitsPerSec = TRANSFER_BAUDRATE;
dspiResult = DSPI_DRV_MasterConfigureBus(1,
&masterDevice,
&calculatedBaudRate);
if (dspiResult != kStatus_DSPI_Success)
{
}
TRANSFER_BAUDRATE这个宏是你要配置的DSPI的传输速度,calculatedBaudRate是实际配置好的DSPI的传输速度(毕竟不能你想要多少就给多少的了),貌似设置的最高是30MHz,然后DSPI初始化完了,开始写DSPI的发送接收函数。dspi_command_config_t commandConfig =
{
.isChipSelectContinuous = false,
.whichCtar = kDspiCtar0,
.whichPcs = kDspiPcs1,
.clearTransferCount = true,
.isEndOfQueue = false
};
uint8_t SPI1_ReadWriteByte(uint8_t sendBuffer)
{
DSPI_HAL_WriteDataMastermode(SPI1,&commandConfig,sendBuffer);
if(!DSPI_HAL_GetIntMode(SPI1,kDspiTxComplete))
{
while(!DSPI_HAL_GetStatusFlag(SPI1,kDspiTxComplete));
DSPI_HAL_ClearStatusFlag(SPI1,kDspiTxComplete);
}
return (uint8_t)DSPI_HAL_ReadData(SPI1);
}
之前使用DRIVER层驱动,会出现各种各样的问题,有时候还会导致程序卡死、跑飞,最后使用HAL层的驱动才搞定,可能是DSPI的FIFO和DMA以及中断的问题。
底层驱动函数都搞好了,然后是FLASH的各种指令及状态寄存器的读写,可以直接使用已经写好的,不必再去浪费时间重新写。
最后测试一下,读FLASH的ID,读出来是0XC815,这里就不啰嗦了,和GD25Q32的ID一致,我这里有一个FLASH烧录器可以烧些数据进去,用FRDM-K64读出来,看是不是正确的,简单测试了下没有什么问题,这个KSDK虽然结构很复杂,但是操作起来还是比较简单,希望飞思卡尔的KSDK更完善,然后可以开放那个工程生成工具的源码,优化UI。
|