Доброго времени суток.
Суть проблемы. При осуществлении циклического чтения регистра 5600ВГ1У через последовательный порт
один раз в 10-20 тыс циклов результат чтения приходит не в 4 и 5 байты массива, а в 3 и 4, при этом
количество прочитанных байт становится не 6, а 5. Куда девается еще один байт, неясно. Что я делаю не так?
ВГ1У подключен к порту SSP микроконтроллера 1986ВЕ92У по четырем линиям, в которых последовательно стоят резисторы по 50 Ом (кроме RxD),
а на линии RxD (MISO) стоит делитель 510Ом/1кОм, из-за отсутствия толерантности портов с аналоговыми функциями к 5 В.
//Настройка порта
PI.PORT_Pin = (SSP_TXD | SSP_CLK | SSP_FSS);
PI.PORT_OE = PORT_OE_OUT; // IN for slave
PI.PORT_FUNC = PORT_FUNC_ALTER;
PI.PORT_MODE = PORT_MODE_DIGITAL;
PI.PORT_SPEED = PORT_SPEED_MAXFAST;
PORT_Init(SSP_PORT, &PI);
PI.PORT_Pin = (SSP_RXD);
PI.PORT_OE = PORT_OE_IN; // OUT for slave
PORT_Init(SSP_PORT, &PI);
//Инициализация SSP
SSP_BRGInit(MDR_SSP,SSP_HCLKdiv1);// SSPCLK = HCLK / 1; HCLK - главный таймер
SSP_StructInit(&sSSP);
sSSP.SSP_SCR = 0x01; //частота передачи данных SSPCLK / ( CPSDVR * (1 + SCR) )
sSSP.SSP_CPSDVSR = 0x06;//0x06-7.5 Mbit/s
sSSP.SSP_Mode = SSP_ModeMaster;
sSSP.SSP_WordLength = SSP_WordLength8b;
sSSP.SSP_SPH = SSP_SPH_2Edge;
sSSP.SSP_SPO = SSP_SPO_Low;
sSSP.SSP_FRF = SSP_FRF_SPI_Motorola;
sSSP.SSP_HardwareFlowControl = SSP_HardwareFlowControl_None;//
SSP_Init (MDR_SSP,&sSSP);
SSP_Cmd(MDR_SSP, ENABLE);
//Тест 5600ВГ1У
RSTDOWN;
wt(RST);
RSTUP;
while(1){
while(MDR_SSP->SR & SSP_SR_RNE)
tmp_data=MDR_SSP->DR;//Get_Char();
TmpArray[0]=_5600VG1U_RD_CMD; //read cmd
TmpArray[1]=(unsigned char)(_GCTRL >> 8); //address
TmpArray[2]=(unsigned char)_GCTRL; //address
TmpArray[3]=0x00;TmpArray[4]=0x00;TmpArray[5]=0x00;
while(MDR_SSP->SR & SSP_SR_TNF && CounterS < 6)
MDR_SSP->DR = TmpArray[CounterS++];
while(MDR_SSP->SR & (SSP_SR_BSY));
while(MDR_SSP->SR & SSP_SR_RNE)
TmpArray[CounterR++] = MDR_SSP->DR;
//В 4 и 5 элементах массива д.б. 0x43 и 0x82
//Иногда они оказываются после чтения в 3 и 4 элементах массива TmpArray
//при этом CounterR равен 5 байтам, а не 6
//поэтому результат не //result = ((TmpArray[5]<<8)&0xFF00)|TmpArray[4], а
result = ((TmpArray[CounterR-2]<<8)&0xFF00)|TmpArray[CounterR-1];//так работает более-менее
//и даже в этом случае иногда (1 раз на 1-5 млн. циклов) результат сбивается,
//только теперь не влево, а вправо на 1 байт и CounterR равен тоже 5.
}
Сделал проверку, на количество принятых байт, типа если приняли в приемный буфер при чтении регистра 5 байт, а не 6, то повторное чтение. Не помогло.
Теперь периодически приходит и в четвертом и в пятом байтах одинаковая информация (0х43)