RT1176に2台のカメラを統合する準備をしています。
現在、1台のカメラがCSIインターフェースで正常に動作しています。
追加カメラについては、FLEXIO2を使用して16ビットパラレルカメラデータを受信する機能の実装に取り組んでいます。
AN12686 と flexio_camera_rt1010 GitHub リポジトリを参照して、16 ビット データの受信を試みました。
DMA コールバックがトリガーされている間、受信したデータが正しくないように見えます。
HSYNCおよびPCLK(24MHz)信号は正しく受信されています。
どのような追加設定が必要になるかについてのガイダンスをいただければ幸いです。
添付されている関連コードを見つけてください。あなたの援助を大いに歓迎するでしょう。
よろしくお願いいたします。
void FLEXIO_CAMERA_Init(FLEXIO_CAMERA_Type *base, const flexio_camera_config_t *config)
{
assert((base != NULL) && (config != NULL));
assert(base->shifterCount > 0U);
uint32_t i = 0U;
volatile uint32_t controlVal = 0U;
#if !(定義(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) & FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
/* フレキシオクロックをアンゲートします。*/
CLOCK_EnableClock(s_flexioClocks[FLEXIO_CAMERA_GetInstance(ベース)]);
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
flexio_shifter_config_t shifterConfig;
flexio_timer_config_t timerConfig;
/* shifterConfig と timerConfig 構造体をクリアします。*/
(void)memset(&shifterConfig, 0, sizeof(shifterConfig));
(void)memset(&timerConfig, 0, sizeof(timerConfig));
/* フレキシオカメラの設定 */
controlVal = base->flexioBase->CTRL;
controlVal &=
~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK);
controlVal |= (FLEXIO_CTRL_DBGE(config->enableInDebug) |FLEXIO_CTRL_FASTACC(config->enableFastAccess) |
FLEXIO_CTRL_FLEXEN(config->enablecamera));
if (!config->enableInDoze)
{
controlVal |= FLEXIO_CTRL_DOZEN_MASK;
}
base->flexioBase->CTRL = controlVal;
/* FLEXIO_CAMERAシフター設定 */
shifterConfig.timerSelect = base->timerIdx;
shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive;
shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled;
shifterConfig.pinSelect = base->datPinStartIdx;
shifterConfig.pin極性 = kFLEXIO_PinActiveHigh;
shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive;
shifterConfig.parallelWidth = 16 - 1U;
shifterConfig.inputSource = kFLEXIO_ShifterInputFromNextShifterOutput;
shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable;
shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable;
/* シフターを FIFO バッファーとして構成します。*/
for (i = base->shifterStartIdx; i < (base->shifterStartIdx + base->shifterCount - 1U); i++)
{
FLEXIO_SetShifterConfig(base->flexioBase, (uint8_t)i, &shifterConfig);
}
shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin;
FLEXIO_SetShifterConfig(base->flexioBase, (uint8_t)i, &shifterConfig);
/* タイマー設定FLEXIO_CAMERA、PCLKのclkはシフターを駆動するタイマーのソースであり、HREFは選択です
*利用可能なデータの信号。*/
timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->hrefPinIdx);
timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh;
timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal;
timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled;
timerConfig.pinSelect = base->pclkPinIdx;
timerConfig.pinPolarity = kFLEXIO_PinActiveHigh;
timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit;
timerConfig.timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset;
timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput;
timerConfig.timerReset = kFLEXIO_TimerResetOnTimerTriggerRisingEdge;
timerConfig.timerDisable = kFLEXIO_TimerDisableOnTriggerFallingEdge;
timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerRisingEdge;
timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled;
timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled;
#ifdef __CAMERA_DATA_16BIT__
timerConfig.timerCompare = 2*((32*base->shifterCount)/16)-1U;
#else
timerConfig.timerCompare(タイマー設定.タイマー比較)= 8U * base->shifterCount - 1U;
#endif
FLEXIO_SetTimerConfig(base->flexioBase, (uint8_t)base->timerIdx, &timerConfig);
/* フラグをクリアします。*/
FLEXIO_ClearShifterErrorFlags(base->flexioBase, (((1UL << (base->shifterCount)) - 1U) << (base->shifterStartIdx)));
FLEXIO_ClearTimerStatusFlags(base->flexioBase, 1UL << (base->timerIdx));
}
int32_t cameraStartFrame(volatile uint8_t *pDest, const uint32_t numFrames)
{
ビジー = true;
flexio_camera_transfer_t cameraTransfer;
cameraTransfer.dataAddress = (uint32_t)pDest;
cameraTransfer.dataNum = g_width * g_height * sizeof(uint16_t) * numFrames;
フレームカウンター = 0;
numFramesExpected = numFrames;
FLEXIO_CAMERA_ClearStatusFlags(&g_FlexioCameraDevice, kFLEXIO_CAMERA_RxDataRegFullFlag | kFLEXIO_CAMERA_RxErrorFlag);
g_cameraEdmaHandle.rxState = 0;
FLEXIO_CAMERA_TransferReceiveEDMA(&g_FlexioCameraDevice, &g_cameraEdmaHandle, &cameraTransfer);
return 0;
}
int InitParallelCamera(void)
{
edma_config_t edmaConfig;
flexio_camera_config_t cameraConfig;
CLOCK_EnableClock(kCLOCK_Flexio2);
FLEXIO_Reset(FLEXIO2);
/* DMAMUX の設定 */
DMAMUX_Init(DMAMUX0);
// DMAMUX_SetSource(DMAMUX0, FLEXIO_CAMERA_DMA_CHN, FLEXIO_CAMERA_DMA_MUX_SRC);
DMAMUX_SetSource(DMAMUX0, FLEXIO_CAMERA_DMA_CHN, (g_FlexioCameraDevice.shifterStartIdx+ 1U));
DMAMUX_EnableAlwaysOn(DMAMUX0, FLEXIO_CAMERA_DMA_CHN, true);
DMAMUX_EnableChannel(DMAMUX0、FLEXIO_CAMERA_DMA_CHN);
/* DMAの設定 */
EDMA_GetDefaultConfig(&edmaConfig);
edmaConfig.enableDebugMode = true;
EDMA_Init(DMA0, &edmaConfig);
EDMA_CreateHandle(&g_edmaHandle, DMA0, FLEXIO_CAMERA_DMA_CHN);
FLEXIO_Reset(FLEXIO2);
FLEXIO_CAMERA_GetDefaultConfig(&cameraConfig);
FLEXIO_CAMERA_Init(&g_FlexioCameraDevice, &cameraConfig);
/* すべてのフラグをクリアします。*/
FLEXIO_CAMERA_ClearStatusFlags(&g_FlexioCameraDevice, kFLEXIO_CAMERA_RxDataRegFullFlag | kFLEXIO_CAMERA_RxErrorFlag);
FLEXIO_ClearTimerStatusFlags(FLEXIO2, 0xFF);
/* FlexIO を有効にします。*/
FLEXIO_CAMERA_Enable(&g_FlexioCameraDevice, true);
int32_tステータス = FLEXIO_CAMERA_TransferCreateHandleEDMA(&g_FlexioCameraDevice, &g_cameraEdmaHandle, FLEXIO_CAMERA_UserCallback, NULL, &g_edmaHandle);
PRINTF(">>>> end InitparallelCamera() status = %d\r\n", status);
}