Доброго времени суток!
Есть вопрос по работе с мостом пересинхронизации в процессоре 1901ВЦ1Т.
Есть основной код.
Код:
void main()
{
ConfigClockCoreRISC();
LoadAndRunDSP();
while(1);
}
и процедуры
1)
Код:
void ConfigClockCoreRISC(void)
{
RST_CLK->HS_CONTROL = RST_CLK_HS_CONTROL_HSE_ON;
while((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY) != RST_CLK_CLOCK_STATUS_HSE_RDY);
RST_CLK->CPU_CLOCK = 2 << RST_CLK_CPU_CLOCK_CPU_C1_SEL_Pos;
RST_CLK->PLL_CONTROL = (6 << RST_CLK_PLL_CONTROL_PLL_CPU_MUL_Pos)
| RST_CLK_PLL_CONTROL_PLL_CPU_ON
;
while((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_CPU_RDY) != RST_CLK_CLOCK_STATUS_PLL_CPU_RDY);
RST_CLK->PER_CLOCK |= 1 << 3;
EEPROM->CMD = 2 << 3;
RST_CLK->PER_CLOCK &= ~(1 << 3);
RST_CLK->CPU_CLOCK |= (RST_CLK_CPU_CLOCK_CPU_C2_SEL)
|((0x7<<RST_CLK_CPU_CLOCK_CPU_C3_SEL_Pos)&RST_CLK_CPU_CLOCK_CPU_C3_SEL_Msk)
|((1 << RST_CLK_CPU_CLOCK_HCLK_SEL_Pos)&RST_CLK_CPU_CLOCK_HCLK_SEL_Msk)
;
}
2)
Код:
void LoadAndRunDSP(void)
{
uint16_t * DSP_Pointer;
if ((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY) != RST_CLK_CLOCK_STATUS_HSE_RDY)
{
RST_CLK->HS_CONTROL |= RST_CLK_HS_CONTROL_HSE_ON;
while((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY) != RST_CLK_CLOCK_STATUS_HSE_RDY);
}
RST_CLK->DSP_CLOCK = 0 << RST_CLK_DSP_CLOCK_DSP_C1_SEL_Pos;
RST_CLK->PLL_CONTROL |= RST_CLK_PLL_CONTROL_PLL_DSP_ON
|(8 << RST_CLK_PLL_CONTROL_PLL_DSP_MUL_Pos)
;
while((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_DSP_RDY) != RST_CLK_CLOCK_STATUS_PLL_DSP_RDY);
RST_CLK->DSP_CLOCK |= RST_CLK_DSP_CLOCK_DSP_C2_SEL
//| RST_CLK_DSP_CLOCK_DSP_C3_SEL
| RST_CLK_DSP_CLOCK_DSP_CLK_EN
;
RST_CLK->DSP_CONTROL_STATUS|=0x8010;
RST_CLK->DSP_CONTROL_STATUS&=0xFFF2;
while ((RST_CLK->DSP_CONTROL_STATUS & 0x000D) != 0);
WriteDataDelayDSPMemory();
sleep_iter(10);
DSP_CLK->CLKMD = 0x7800;
while ((DSP_CLK->CLKMD & 0x7800) != 0x7800);
WriteDataDelayDSPMemory();
DSP_Pointer = (uint16_t*)(0x30000100); // main
*DSP_Pointer++ = 0x6bf8 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0x0080 ;WriteDataDelayDSPMemory();
DSP_Pointer = (uint16_t*)(0x30020000+0x000D*2); // main
*DSP_Pointer++ = 0x6bf8 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0x0080 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0x0001 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0x6bf8 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0x0081 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0x0001 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0xf073 ;WriteDataDelayDSPMemory();
*DSP_Pointer = 0x000d ;WriteDataDelayDSPMemory();
DSP_Pointer = (uint16_t*)(0x30020000+0xFF80*2); // vector
*DSP_Pointer++ = 0xF495 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0xF495 ;WriteDataDelayDSPMemory();
*DSP_Pointer++ = 0xF073 ;WriteDataDelayDSPMemory();
*DSP_Pointer = 0x000D ;WriteDataDelayDSPMemory();
EnableCoreDSP();
}
3)
void sleep_iter(uint32_t C)
{
while (C--);
}
4) Процедуру WriteDataDelayDSPMemory честно скопипастил из проекта, который нашел на форуме здесь в теме.
Код:
void WriteDataDelayDSPMemory(void)
{
while((RST_CLK->DSP_CONTROL_STATUS&0x4000)==0);
}
Вопрос в том, что если ставить малое значение для sleep_iter() в функции LoadAndRunDSP; , то DSP_CLK->CLKMD = 0x7800; присваивание, вроде как, не успевает проводится, хотя операции с мостом пересинхронизации вроде закончены (судя по флагу.
Что я не правильно использую?
Может после подачи тактирования на переферию надо ждать, т.к. мост пересинхронизации тоже является переферией DSP со стороны DSP?
P.S.
Естественно память у меня не пишется. и до запуска DSP дело не доходит.