Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-18 11:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 2016-ноя-23 15:50 
Не в сети

Зарегистрирован: 2015-июн-24 16:20
Сообщения: 11
Доброго времени суток.
Суть проблемы. При осуществлении циклического чтения регистра 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)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 1986ВЕ9x <-> SPI <-> 5600ВГ1У
СообщениеДобавлено: 2016-ноя-30 20:17 
Не в сети

Зарегистрирован: 2015-июн-24 16:20
Сообщения: 11
Более конкретный вопрос:
Обязательно ли вручную дергать линию SSP_FSS.
Во всех примерах так и делают.
При указанных настройках SSP она устанавливается сама. Или я не прав?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB