在线时间37 小时
UID2087604
注册时间2014-4-22
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 303
- 最后登录
- 2021-11-15
|
本帖最后由 LuoHG 于 2015-9-10 22:49 编辑
利用MAPS开发板弄一个GUI设计,用Kinetis做GUI设计真的很纠结,NXP和STM都用上了高大上的emWin了,一真梦想FSL咋时候让卡粉们也能用上emWin呢,难道非逼着我转道MDK用其emWin不成,MDK的文件分层做得很不到位这点很无耐,而FSL把自家的eGUI开源之后貌似攻城狮们都不太感冒,论坛反响极少,连杜娘都把egui YY 成"鳄龟", 。我也看了很久的eGUI doc,不可否认的是它虽然很强大,但程序设计相当的复杂,要真使用还得先缓一缓,得先弄点简单的下手才行,于是就盯上了板上的SPI LCM,它的FlexBus LCD先留着后期跑ucGUI,要用SPI LCM,必须使用DSPI模块啊,然后上参照Kinetis SDK v1.1 API Reference Manual中的9.3 DSPI Master Driver配置SPI2,然后用阻塞式发送,结果调用阻塞发送系统就跑飞到“HardFault_Handler B .”去了,阻塞发送时要是单步调试则可以正常执行,看V1.1里的demo就偏偏没有DSPI的例程,MAPS的例程是初始化用DRV层,发送直接调用寄存器操作了,看来MAPS也是拿SDK一点办法都木有,对明显的缺陷也只能避而不谈,那个例程虽然能点亮LCM,但离真正应用于产品那差距大了去了,字库还要转换到显存,而不是字库与显示一一对应,把字库按显存要求转换后,应用程序直接将字库送到显存显示那才是效率啊。吐槽了这么多,主要表示用户使用这FSL的SDK真的亚力山大啊,被坑了一回又一回,海燕呐,你可长点心吧 ,啥时候才能让用户用得更省点心啊 ,学一学STMcube,SDK做得好,拥趸无限多,听说人家的Cortex-M7评估板也上市了,不得不佩服真是速度啊。直接上代码,看看FAE大神们是否能给点解决之道 。
#include "fsl_dspi_hal.h"
#include "fsl_dspi_master_driver.h"
#define SPI_COM_MAX_NUM 2
typedef enum _SpiComNoDef
{
kSpiComLcm = 0,
kSpiComFlash,
} SpiComNo_t;
static const uint8_t ucMasterInstance[SPI_COM_MAX_NUM] = {HW_SPI2, HW_SPI2};
/*< Configure the members of the user config. */
static const dspi_master_user_config_t xMasterCfg[SPI_COM_MAX_NUM] =
{
{
.whichCtar = kDspiCtar0,
.isSckContinuous = false,
.isChipSelectContinuous = false,
.whichPcs = kDspiPcs1,
.pcsPolarity = kDspiPcs_ActiveLow,
},
{
.whichCtar = kDspiCtar0,
.isSckContinuous = false,
.isChipSelectContinuous = false,
.whichPcs = kDspiPcs0,
.pcsPolarity = kDspiPcs_ActiveLow,
}
};
static const dspi_device_t xSpiMasterDev[SPI_COM_MAX_NUM] =
{
{
.bitsPerSec = 1000000,
.dataBusConfig.bitsPerFrame = 8,
.dataBusConfig.clkPolarity = kDspiClockPolarity_ActiveHigh,
.dataBusConfig.clkPhase = kDspiClockPhase_FirstEdge,
.dataBusConfig.direction = kDspiMsbFirst,
},
{
.bitsPerSec = 1000000,
.dataBusConfig.bitsPerFrame = 8,
.dataBusConfig.clkPolarity = kDspiClockPolarity_ActiveHigh,
.dataBusConfig.clkPhase = kDspiClockPhase_FirstEdge,
.dataBusConfig.direction = kDspiMsbFirst,
}
};
static dspi_master_state_t xMasterState[SPI_COM_MAX_NUM];
void vPinMuxSpiConfig(uint32_t ulInstance)
{
switch(ulInstance)
{
case HW_SPI2: /* SPI2 */
/* Enable the clock for SPI module */
CLOCK_SYS_EnableSpiClock(HW_SPI2);
/* Affects PORTD_PCR11 register */
PORT_HAL_SetMuxMode(PORTD_BASE, 11u, kPortMuxAlt2); // SPI2_PCS0
/* Affects PORTD_PCR12 register */
PORT_HAL_SetMuxMode(PORTD_BASE, 12u, kPortMuxAlt2); // SPI2_SCK
/* Affects PORTD_PCR13 register */
PORT_HAL_SetMuxMode(PORTD_BASE, 13u, kPortMuxAlt2); // SPI2_SOUT
/* Affects PORTD_PCR14 register */
PORT_HAL_SetMuxMode(PORTD_BASE, 14u, kPortMuxAlt2); // SPI2_SIN
/* Affects PORTD_PCR15 register */
PORT_HAL_SetMuxMode(PORTD_BASE, 15u, kPortMuxAlt2); // SPI2_PCS1
break;
default:
break;
}
}
void vSpiComInit(void)
{
uint8_t ucComIdx;
uint32_t ulInstance;
uint32_t ulDelayInNanoSec;
uint32_t ulCalculateDelay;
uint32_t ulCalculateBaudRate;
dspi_status_t xSpiStatus;
ucComIdx = 0;
while (ucComIdx < SPI_COM_MAX_NUM)
{
ulInstance = ucMasterInstance[ucComIdx];
/*< SPI pin configure. */
vPinMuxSpiConfig(ulInstance);
/*< Init the DSPI module. */
xSpiStatus = DSPI_DRV_MasterInit(ulInstance, &xMasterState[ucComIdx], \
&xMasterCfg[ucComIdx]);
if (kStatus_DSPI_Success != xSpiStatus)
while (true) {}
/*< Configure the SPI bus. */
xSpiStatus = DSPI_DRV_MasterConfigureBus(ulInstance, &xSpiMasterDev[ucComIdx], \
&ulCalculateBaudRate);
if (kStatus_DSPI_Success != xSpiStatus)
while (true) {}
/*< PCS to SCK Delay option. */
ulDelayInNanoSec = 200;
xSpiStatus = DSPI_DRV_MasterSetDelay(ulInstance, kDspiPcsToSck, \
ulDelayInNanoSec, &ulCalculateDelay);
if (kStatus_DSPI_Success != xSpiStatus)
while (true) {}
++ucComIdx;
}
uint8_t ucSpiTxBuffer[4] = {0x01, 0x02, 0x03, 0x04};
uint8_t ucSpiRxBuffer[4] = {0x01, 0x02, 0x03, 0x04};
iSpiComExchangeData(kSpiComLcm, ucSpiTxBuffer, ucSpiRxBuffer, 4); // 调试时用F10必死无疑,用F11一步步深入可正常,FSL能不能这样坑人啊
}
int16_t iSpiComExchangeData(uint8_t ucComNo, uint8_t *pucSnd, uint8_t *pucRcv, uint16_t uiLen)
{
dspi_status_t xSpiStatus;
if ( (NULL == pucSnd) || (NULL == pucRcv) )
return API_INVALID;
if ( (ucComNo >= SPI_COM_MAX_NUM) || (0 == uiLen) )
return API_FAIL;
xSpiStatus = DSPI_DRV_MasterTransferBlocking(ucMasterInstance[ucComNo], \
&xSpiMasterDev[ucComNo], \
pucSnd, pucRcv, uiLen, 1000);
if (kStatus_DSPI_Success != xSpiStatus)
return false;
else
return true;
}
|
评分
-
查看全部评分
|