在线时间68 小时
UID2029919
注册时间2014-9-24
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 444
- 最后登录
- 2019-3-7
|
本帖最后由 晓枫VS枯叶 于 2015-11-4 10:15 编辑
飞思卡尔官方发布的KSDK也有好长一段时间了,但是实际的例程却相当的少,今天来发一个K64的DSPI驱动FLASH的例程。首先是建一个KSDK的工程,官方发布的KSDK_Project_Generator.exe这个软件虽然UI做的很粗糙,但是用起来还是蛮简单的。由于使用的是IAR所以直接勾选了生成IAR工程,具体配置如下图所示:
点击advanced就会生成工程,生成的工程文件夹如下图所示:
由于要添加自己的驱动函数所以我把上面的文件夹改成如下图所示的结构,几个单独的文件被我直接扔到了Application文件夹里,drivers文件夹主要放自己的一些设备的驱动程序:
我修改完后,打开IAR同时添加了一个Drivers的Group,同时把上面三个文件重新添加一遍,以防编译时出现错误,同时还要添加必要的头文件目录,这个根据需求添加,由于移动了main.h所以Application也要添加到头文件目录里 。接下来就是DSPI的配置了,喜欢用PE的也可以使用PE生产后复制过来。- 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。
|
|