Jump to content

    

overloaded

Свой
  • Content Count

    73
  • Joined

  • Last visited

Community Reputation

0 Обычный

About overloaded

  • Rank
    Участник
  • Birthday 01/01/1985

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Киев
  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()) CODEstatic 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); } } } [attachment=68769:SSP.PNG]
  2. Кого можете посоветовать чтоб продавали в розницу и слали в Украину с "умеренно" качественной продукцией? (Понятно что за действительно классное качество надо платить)
  3. Посоветуйте плз поставщика для коллекторного двигателя на пост. магнитах ~1кВт, 48-100В, 2-3 тыс. об/мин и по максимально бюджетной цене(<= 250$). Желательно (но не обязательно) в Украине. Китайские которые приглядывал мягко говоря не впечатлили качеством ((
  4. Буду ставить или контроллер или SPI->LVDS) Спасибо.
  5. Цитата(kovigor @ May 10 2011, 20:09) 1. Во-первых, реально. Во-вторых - перестраховка. Схема без буфера будет работать (как-то, но будет) ровно до первой грозы. Первый же разряд молнии выпустит из вашего МК потроха. Это из личного многолетнего опыта эксплуатации Current Loop. 2. Криво это как-то - разные сигналы одного и того же интерфейса доставляются к потребителю разными способами. Подумайте сами. Выглядит очень неестественно, и работать почти наверняка будет плохо. Уж лучше тогда на плате каждого датчика разместить по конвертеру RS485<->SPI на простейшей ATTINY, а уже эти конвертеры сажать на общую шину ... Скорее всего конечно 4 485х и поставлю, Вы меня убедили. Но все-же интересно, почему работать должно плохо с токовой петлей? CS программный, все задержки можно учесть... Вариант с МК рассматривал, но т.к. нет необходимости пред-обработки данных датчика отказался. Да и стоимость даже тини2313 с обвязкой будет порядка стоимости пары драйверов 485.
  6. Цитата(kovigor @ May 10 2011, 19:13) Обязательно нужно. Ток придется повысить, как минимум миллиампер до 10-ти, что, кстати, послужит и защитой от помех. В качестве буфера должно хватить и обычного транзистора. А разве реально навести помехой скажем 1,5 мА на длине 10м в реальной жизни? Или это просто перестраховка? Цитата(kovigor @ May 10 2011, 19:13) P.S. Чувствую, что у вас постановка задачи неправильная. Использовать Current Loop для удлинения сигнала CS SPI - по-моему абсолютно недопустимо. Или реализуйте весь интерфейс как развязанный SPI, или как развязанный CL. Или вообще примените тот же развязанный RS485 ... На самом деле мне развязка скорее всего и не нужна. Есть несколько датчиков (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. LPC2478 + TFT 320x240 совсем рябит (

    Это COMMON ELECTRODE CENTER VOLTAGE. Т.е. средняя точка, относительно которой подается то прямая то обратная полярность на ТФТ транзисторы (чтоб не было берн-ина т.е. "вжегшейся" картинки). Есть разные схемы организации экранов, в этом одна полярность подавалась на четные, другая на нечетные строки, на следующем кадре - наоборот. Т.к. напряжение было неправильным, строки (через одну) были серого цвета вместо черного, чередуясь через каждый кадр давали серый фон и рябь.
  12. LPC2478 + TFT 320x240 совсем рябит (

    Не прошло и года =) В общем фон стал окончательно черным после того как нашел ошибку в схемотехнике подключения экрана (было неправильное напряжение для общего электрода TFT)
  13. Есть ферритовый магнит 24х10х5 мм, намагниченность по высоте (вдоль 5 мм), намагниченность неизвестна, сила сцепления примерно 0,4 кг. Нужно прикинуть максимальное расстояние уверенной сработки логического датчика Холла, макс. индукция включения которого 19mT. Еще есть вариант вместо магнитов использовать магнитный винил (типа как наклейки для холодильника), сложенный в несколько слоев, но там характеристик вообще нет, если кто использовал поделитесь опытом =) Ни датчика ни магнитов пока на руках нет.. Да и покупать датчик не спешу т.к. подозреваю что вполне может понадобиться гораздо более чувствительный. Заранее спасибо.
  14. flash сам полу-стерся

    Да, висел. С расчетом на то, что все-равно секюрити бит установлен. Просто в ДШ написано что секюрити бит стирается только после полного стирания флэш, а выходит, что, подобрав длину импульса, выдаваемого на 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, или ему станет плохо от "установки" при каждом включении контроллера? Или может есть способ программно проверить установлен ли он? Спасибо за внимание =)