Перейти к содержанию
    

overloaded

Свой
  • Постов

    73
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о overloaded

  • Звание
    Участник
    Участник
  • День рождения 01.01.1985

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

1 732 просмотра профиля
  1. LPC24 проблема с SSP

    Приветствую! После нескольких секунд/минут нормальной работы SSP (режим SPI master), перестает вызываться tn_sem_isignal(&semSSP1); из IntHandlerSSP1(), т.к. счетчик принятых байт SSP1_iByteIndex меньше требуемого количества данных - SSP1_iByteCnt. В свою очередь это вызвано тем, что происходит переполнение RX FIFO (после "зависания" установлен бит RORRIS, см. скриншот). При этом на линии все нормально, единственное что последний байт проблемной (последней) посылки иногда выходит после небольшого временного промежутка а не мгновенно за предыдущим, в отличии от непрерывного потока байтов до него во всех? предыдущих посылках. Не могу понять как может переполниться RX FIFO, если до записи в TX FIFO он полностью вычитывается ( while(rSSP1SR & (0x1/*RNE*/ << 2)) .... в IntHandlerSSP1()) static void InitSSP1(void) { rPCONP|= (1<<10);//SSP1 on //-- Pins rPINSEL0 |= (0x2<<16) | //-- P0.8 MISO1 (0x2<<18) | //-- P0.9 MOSI1 (0x2<<14); //-- P0.7 SCK1 // rPCLKSEL1 |= (0x00 << 20); //-- Clock div SSP1 //0x00=div4, 0x01 = div1, 0x02 = div2, 0x03=div8 rSSP1CR0 = (0x7/*DSS*/ << 0) | (0x0/*FRF*/ << 4) | (0x1/*CPOL*/ << 6) | (0x1/*CPHA*/ << 7) | (0x0/*SCR*/ << 8); //8 bit, no prescaler rSSP1CR1 = (0x0/*SSE(enable)*/ << 1) | (0x0/*MS*/ << 2);//master rSSP1CPSR = 12;//divider, 72MHz / 4 / 12 = 1.5; rSSP1IMSC = 0;//disable interrupts //--- Interrupts install_irq(11, //-- IntNumber for SSP1 (unsigned int)int_func_ssp1, //-- Handler 2); //-- Priority rSSP1CR1|= (0x1/*SSE(enable)*/ << 1); } int WriteReadSSP1(unsigned char* iobuf, unsigned char length) { int i; rSSP1IMSC = 0;//disable interrupt while(rSSP1SR & (0x1/*BSY*/ << 4))//transmit not finished i=0;//dbg while(rSSP1SR & (0x1/*RNE*/ << 2)) //receive fifo not empty - clear i = rSSP1DR; MCP3903_CS1tmp_CLR();//tmp SSP1_buf = iobuf; SSP1_iByteCnt = length; SSP1_iByteIndex = 0; SSP1_iByteIndexTx = 0; if(length < SSP_FIFO_SIZE) SSP1_iByteIndexTx = length; else SSP1_iByteIndexTx = SSP_FIFO_SIZE; for(i = 0; i < SSP1_iByteIndexTx; i++) rSSP1DR = SSP1_buf[i];//write first bytes to trigger interrupt rSSP1IMSC = (0x1/*RTIM*/ << 1) | (0x1/*RXIM*/ << 2);//enable interrupt tn_sem_acquire(&semSSP1, TN_WAIT_INFINITE);//wait for end of transmit/receive from interrupt MCP3903_CS1tmp_SET();//tmp return SSP1_iByteIndex; } #pragma inline void IntHandlerSSP1() { unsigned int status; status = rSSP1MIS; // Int Request Source if(status & ((0x1/*RTMIS*/ << 1)|(0x1/*RXMIS*/ << 2)) )//rx fifo half-full or unread data in rx fifo { //read data while(rSSP1SR & (0x1/*RNE*/ << 2))//receive fifo not empty { SSP1_buf[sSP1_iByteIndex] = rSSP1DR;//read received byte SSP1_iByteIndex++; } if(SSP1_iByteIndex < SSP1_iByteCnt) { //write data while(rSSP1SR & (0x1/*TNF*/ << 1))//transmit fifo not full { if(SSP1_iByteIndexTx < SSP1_iByteCnt) { rSSP1DR = SSP1_buf[sSP1_iByteIndexTx];//write byte SSP1_iByteIndexTx++; } else break; } } else { rSSP1IMSC = 0;//disable interrupts tn_sem_isignal(&semSSP1); } } }
  2. Кого можете посоветовать чтоб продавали в розницу и слали в Украину с "умеренно" качественной продукцией? (Понятно что за действительно классное качество надо платить)
  3. Посоветуйте плз поставщика для коллекторного двигателя на пост. магнитах ~1кВт, 48-100В, 2-3 тыс. об/мин и по максимально бюджетной цене(<= 250$). Желательно (но не обязательно) в Украине. Китайские которые приглядывал мягко говоря не впечатлили качеством ((
  4. Буду ставить или контроллер или SPI->LVDS) Спасибо.
  5. Скорее всего конечно 4 485х и поставлю, Вы меня убедили. Но все-же интересно, почему работать должно плохо с токовой петлей? CS программный, все задержки можно учесть... Вариант с МК рассматривал, но т.к. нет необходимости пред-обработки данных датчика отказался. Да и стоимость даже тини2313 с обвязкой будет порядка стоимости пары драйверов 485.
  6. А разве реально навести помехой скажем 1,5 мА на длине 10м в реальной жизни? Или это просто перестраховка? На самом деле мне развязка скорее всего и не нужна. Есть несколько датчиков (6-8) с интерфейсом SPI. Клок и данные сажаются на одну шину через драйверы RS485(422). CS-ы решил сделать токовой петлей т.к. дешевле, да и отдельный он, поэтому шинный драйвер как-бы избыточен.. Питается все тем-же питанием что и контроллер, на каждой плате датчика свой стабилизатор. Развязку по входу CS поставил только из соображений разницы питаний (скорее всего незначительной).
  7. А можно поподробней про "буфферизация с защитой от помех" пожалуйста? Это инвертор и супрессоры или что-то посложнее?
  8. Цифровой выход МК (LPC24xx 72МГц) подключается в развязанную токовую петлю 3мА на расстояние до 10м, макс. частота желательна около 1 Мгц(можно меньше, управление выводом CS(SPI)). Нужно ли усиливать? Не будет ли плохо МК впринципе от длинной линии на ноге? Если буферизировать, хватит ли обычного инвертора? Предполагаются помехи от двигателей 1кВт поблизости.
  9. Спасибо, разобрался. Да, так и есть, nRE и DE вместе управляются... Проблему решил программно - отключив приемник во время передачи. Вообще как-то изначально не подумал, что когда приемник драйвера отключен, то его выход в Z а не в логическом состоянии...
  10. При дотрагивании пальцем/щупом до вывода 1 ST485B - RO (receiver output), начинают идти ошибочные пакеты (примерно каждый третий). Длинна дорожки до МК - 3 см. Неужели настолько маленький ток выхода? Скорость 115200.
  11. Это COMMON ELECTRODE CENTER VOLTAGE. Т.е. средняя точка, относительно которой подается то прямая то обратная полярность на ТФТ транзисторы (чтоб не было берн-ина т.е. "вжегшейся" картинки). Есть разные схемы организации экранов, в этом одна полярность подавалась на четные, другая на нечетные строки, на следующем кадре - наоборот. Т.к. напряжение было неправильным, строки (через одну) были серого цвета вместо черного, чередуясь через каждый кадр давали серый фон и рябь.
  12. Не прошло и года =) В общем фон стал окончательно черным после того как нашел ошибку в схемотехнике подключения экрана (было неправильное напряжение для общего электрода TFT)
  13. Есть ферритовый магнит 24х10х5 мм, намагниченность по высоте (вдоль 5 мм), намагниченность неизвестна, сила сцепления примерно 0,4 кг. Нужно прикинуть максимальное расстояние уверенной сработки логического датчика Холла, макс. индукция включения которого 19mT. Еще есть вариант вместо магнитов использовать магнитный винил (типа как наклейки для холодильника), сложенный в несколько слоев, но там характеристик вообще нет, если кто использовал поделитесь опытом =) Ни датчика ни магнитов пока на руках нет.. Да и покупать датчик не спешу т.к. подозреваю что вполне может понадобиться гораздо более чувствительный. Заранее спасибо.
  14. Да, висел. С расчетом на то, что все-равно секюрити бит установлен. Просто в ДШ написано что секюрити бит стирается только после полного стирания флэш, а выходит, что, подобрав длину импульса, выдаваемого на ERASE, можно стереть только первый сектор и сбросить его?.. (А может и вовсе ничего не стирать..) Про битик спасибо, как-то упустил..
  15. flash сам полу-стерся

    Устройство на at91sam7s64B, прошитое самбой с установкой Security Bit. После возвращения мне("перестало работать"), прочитал JTAG-ом флэш(еще раз обращаю внимание на то, что секюрити бит был установлен, ну или по крайней мере должен был установиться при программировании через sam-prog, галка стояла). Считанное содержание идентично прошивке за исключением того, что нулевая страница (первые 128 байт) стерта в FF. Что бы это могло быть? Сразу скажу, что ERASE и TST оставил висячими, но даже, допустим, если ERASE дернулся, с Security Bit ситуация совсем неясна. На всякий случай привожу листинг функции для записи внутренней флэш (запись во флеш используется при работе, но, по идее, нулевая страница записаться никак не могла). #define NVMEM_MCU_FLASH_BASE 0x00100000 #if (NVMEM_TYPE==AT91SAM7S64) #define NVMEM_MCU_FLASH_SIZE 0x10000 #define NVMEM_PAGE_SZ 128 #define NVMEM_CAP_PAGES 384 #define NVMEM_CAP (NVMEM_PAGE_SZ * NVMEM_CAP_PAGES) #define NVMEM_BASE (NVMEM_MCU_FLASH_BASE + (NVMEM_MCU_FLASH_SIZE - NVMEM_CAP))//for linker: program in flash start = 0, end = (NVMEM_MCU_FLASH_SIZE - NVMEM_CAP) -1 #define NVMEM_BASE_PA ((NVMEM_BASE - NVMEM_MCU_FLASH_BASE) / NVMEM_PAGE_SZ) __ramfunc void NVMemWaitReadyStatus() { while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); } __ramfunc int NVMemPageWrite(int PA, int BA, unsigned char* buf, int len, int verify) { unsigned int *pbuf = (unsigned int *)buf; unsigned int *pflash = (unsigned int *)(NVMEM_BASE + NVMEM_PAGE_SZ * PA); int i; if((len != NVMEM_PAGE_SZ)||(BA!= 0)) while(1);//dbg if((PA < 0)||(PA >= NVMEM_CAP_PAGES)) while(1);//dbg len/= 4;//len in int __istate_t istate = __get_interrupt_state(); __disable_interrupt(); for (i = 0; i < len; i++) pflash[i] = pbuf[i]; NVMemWaitReadyStatus(); AT91C_BASE_MC->MC_FCR = (0x5A << 24) | ((NVMEM_BASE_PA + PA) << 8) | AT91C_MC_FCMD_START_PROG; NVMemWaitReadyStatus(); __set_interrupt_state(istate); if(verify) { for (i = 0; i < len; i++) if(pflash[i] != pbuf[i]) return 0; } return 1; } И заодно еще вопрос - можно ли в финальную так сказать прошивку вставить код установки Security Bit, или ему станет плохо от "установки" при каждом включении контроллера? Или может есть способ программно проверить установлен ли он? Спасибо за внимание =)
×
×
  • Создать...