Jump to content

    

Dark Simpson

Участник
  • Content Count

    15
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Dark Simpson

  • Rank
    Участник
  1. Сегодня обновился до самой последней версии. Заодно как следует проверил все еще раз (на STM32F1 и F4): все отлаживается, заливается-выливается, SWV работает.
  2. Да, продавец так пишет, тем не менее все апгрейдится. Просто если обновляться штатным образом, то слетает, причем как-то странно. Если обновляться правильным способом, то все проходит без проблем.
  3. Добрый вечер. Взял бы. Почтой как-нибудь отправите в Мск?
  4. В наличии осталось после одного проекта 3 штуки НОВЫХ вполне няшных мини J-Link'a V8. Фотки: Внутри — полноценный J-Link, только компоненты собраны покомпактнее и левел-шифтеры стоят в BGA корпусах, за счет чего программатор получился очень маленький. Фото комплектных проводов и упаковки: Касательно прошивки — сейчас стоит последняя прошивка, которая работает с последним свежим софтом с сайта без проблем. С покупкой передам все материалы, распиновки, доки, в том числе инструкцию и прошивку, с помощью которой можно обновляться до любых последних оригинальных прошивок без проблем (с указанием любого серийного номера вручную). Цена вопроса: 2000 рублей за штуку, без торга (цена и так приличная). Можете писать: me[dawg)darksimpson{tochka]com или звонить: 8 9l9 729-27-Чl (Александр)
  5. Все. Вроде-бы решил, теперь работает без сбоев и логично себя ведет при смене приоритетов. Я так до конца и не понял, что в сонно-пивном состоянии сделал, но дернуло меня переписать процедуры приема для использования с output compare. Заодно как бонус получил возможность полного дуплекса, т.к. теперь передача идет по прерыванию таймера, а прием по прерыванию с пина и дальше по прерыванию с output compare, таким образом они и получаются независимы друг от друга. Вот код, может быть кому пригодится: Цэ: #include "swuart.h" #include "timing.h" #define SWUART_TXPORT GPIOD #define SWUART_TXPIN GPIO_PIN_5 #define SWUART_RXPORT GPIOD #define SWUART_RXPIN GPIO_PIN_6 // User must ensure calling service interrupt routine at exact intervals // of 1 bit of the dedicated baud rate #define BAUD 1667 #define HALF_BAUD 833 #define test_rx (SWUART_RXPORT->IDR & SWUART_RXPIN) #define set_tx (SWUART_TXPORT->ODR |= SWUART_TXPIN) #define clr_tx (SWUART_TXPORT->ODR &= ~SWUART_TXPIN) #define transmit_in_progress 0x80 // in progress mark #define receive_in_progress 0x08 // in progress mark #define receive_error 0x04 #define receive_buffer_overflow 0x02 #define receive_buffer_full 0x01 #define test_status(a) (swu_sts & a) #define set_status(a) (swu_sts |= a) #define clr_status(a) (swu_sts &= ~a) #define enable_rxpin_int {\ SWUART_RXPORT->CR2 |= (uint8_t)SWUART_RXPIN;\ } #define disable_rxpin_int {\ SWUART_RXPORT->CR2 &= (uint8_t)(~(SWUART_RXPIN));\ } #define enable_rxoc_int {\ TIM3->IER |= (uint8_t)TIM3_IT_CC1;\ } #define disable_rxoc_int {\ TIM3->IER &= (uint8_t)(~(TIM3_IT_CC1));\ } const u8 MSK_TAB[8]= { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; u8 rx_bit, // counter of received bits tx_bit, // counter of transmited bits rx_buff, // receive byte buffer rx_data, // received byte register tx_data, // transmited byte register swu_sts; // SWUART status register u8 swutxbuf[64]; u8 swutxlen, swutxpos = 0; u8 swurxbuf[64]; u8 swurxpos = 0; u8 swuart_tx_u8(u8 B); u8 swuart_rx_u8(u8 *B); void swuart_tx_timing(void); void swuart_rx_start(void); void swuart_rx_timing(void); /* ------------- Interrupts ---------------- */ INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHandler, 15) { if (TIM3_GetFlagStatus(TIM3_FLAG_UPDATE)) { swuart_tx_timing(); TIM3_ClearFlag(TIM3_FLAG_UPDATE); } } INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6) { // There is only one interrupt at Port D — from SW UART RX swuart_rx_start(); } INTERRUPT_HANDLER(TIM3_CAP_COM_IRQHandler, 16) { if (TIM3_GetFlagStatus(TIM3_FLAG_CC1)) { swuart_rx_timing(); TIM3_ClearFlag(TIM3_FLAG_CC1); } } /* ------------- Exported ------------------ */ void SwUInit(void) { GPIO_Init(SWUART_TXPORT, SWUART_TXPIN, GPIO_MODE_OUT_PP_HIGH_SLOW); GPIO_Init(SWUART_RXPORT, SWUART_RXPIN, GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY); TIM3_TimeBaseInit(TIM3_PRESCALER_1, BAUD); TIM3_ITConfig(TIM3_IT_UPDATE, ENABLE); TIM3_UpdateRequestConfig(TIM3_UPDATESOURCE_REGULAR); TIM3_OC1Init(TIM3_OCMODE_TIMING, TIM3_OUTPUTSTATE_DISABLE, 0, TIM3_OCPOLARITY_LOW); // RX OC TIM3_Cmd(ENABLE); } u8 SwUTx(u8 len, u16 to) { u8 i = 0; for (; i < len; i++) { dswrx = to; while (swuart_tx_u8(swutxbuf[i]) == FALSE && dswrx > 0) {} if (dswrx == 0) break; } return i; } u8 SwURx(u16 to) { swurxpos = 0; dswrx = to; while (1) { while (swuart_rx_u8(&swurxbuf[swurxpos]) == FALSE && dswrx > 0) {} if (dswrx == 0) return swurxpos; swurxpos++; dswrx = 10; } } /* ------------- Private ------------------- */ u8 swuart_tx_u8(u8 B) { if (!test_status(transmit_in_progress)) { tx_data = b; tx_bit = 0; set_status(transmit_in_progress); return(TRUE); } else return(FALSE); } u8 swuart_rx_u8(u8 *B) { u8 res; if (test_status(receive_buffer_full)) { *b = rx_data; res = swu_sts & 0x0F; // return only rx part of status clr_status(receive_error); clr_status(receive_buffer_full); clr_status(receive_buffer_overflow); return(res); } else return(FALSE); } void swuart_rx_start(void) { if (!test_status(receive_in_progress)) { // Disable GPIO interrupt disable_rxpin_int; // Init reception, set "receive in progress" status rx_bit = 0; set_status(receive_in_progress); // Configure output compare point uint16_t cnt = TIM3_GetCounter(); TIM3_SetCompare1((BAUD-cnt > HALF_BAUD) ? cnt+HALF_BAUD : cnt-HALF_BAUD); // Clear false pending OC interrupt (if exist) TIM3_ClearFlag(TIM3_FLAG_CC1); // Start output compare interrupts enable_rxoc_int; } } void swuart_tx_timing(void) { if (test_status(transmit_in_progress)) { switch (tx_bit) { case 0: clr_tx; break; case 9: set_tx; break; case 10: clr_status(transmit_in_progress); break; default: if (tx_data & MSK_TAB[tx_bit-1]) set_tx; else clr_tx; }; tx_bit++; } } void swuart_rx_timing(void) { if (test_status(receive_in_progress)) { u8 rx_samp = test_rx; if (rx_bit == 0) // start bit! { if (rx_samp == 0) // correctly received, continue { rx_bit = 1; rx_buff = 0; } else // noise in start bit, find next one { disable_rxoc_int; clr_status(receive_in_progress); enable_rxpin_int; } } else { if (rx_bit <= 8) // bit <= 8, receive data bits { if (rx_samp) rx_buff |= MSK_TAB[rx_bit-1]; rx_bit++; } else // bit > 8, receive stop bit { if (rx_samp) // valid stop bit { if (!test_status(receive_buffer_full)) { rx_data = rx_buff; set_status(receive_buffer_full); } else set_status(receive_buffer_overflow); } else { rx_data = 0x00; set_status(receive_error); } disable_rxoc_int; clr_status(receive_in_progress); enable_rxpin_int; } } } } Хэ: #ifndef __SW_UART_H #define __SW_UART_H #include "stm8s.h" #define RX_ERROR 4 #define RX_BUFF_OVFL 2 #define RX_BUFF_FULL 1 extern u8 swutxbuf[64]; extern u8 swurxbuf[64]; void SwUInit(void); u8 SwUTx(u8 len, u16 to); u8 SwURx(u16 to); #endif /* __SW_UART_H */
  6. Спасибо, хорошая, годная мысоль. Вечером попробую. Хотя, как мне кажется (и насколько я помню, вроде-бы, по колл-стэку), там вытеснение все-таки вытесняет. Тем более, заметна разница в поведении программы. Но на всякий случай проверю. Не помешает, конечно же!
  7. Увы и ах, есть подозрение, что на все это и еще кучу всего остального банально не хватит процессорного времени :( Да и дело-то даже не в этом. Просто хочется понять что за мистика происходит... Или же все дело в кривых руках? Но тогда где именно?
  8. Всем добрый вечер. На днях столкнулся с такой проблемой — никак не могу разрулить, почему ничерта не работает. Есть проект, собирается в IAR 1.30.1, библиотеки ST 2.1.0. Помимо всего прочего, в проекте используется софт-уарт и разносольный таймер, с которыми и возникает какая-то проблема. Разносольный таймер, TIM4, настроен на генерацию прерывания каждую миллисекунду вот так: // Timer 4 as system tick, f = 1 kHz CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE); TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124); TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); TIM4_Cmd(ENABLE); и внутри него крутятся разные софт-таймеры и мигалки светодиодами, типа: INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23) { if (TIM4_GetFlagStatus(TIM4_FLAG_UPDATE)) { // Process Delay1 if (d1p > 0) d1p--; // Process SWUART RX delay counter if (dswrx > 0) dswrx--; IndicationTick(); // Clear flar (rearm interrupt) TIM4_ClearFlag(TIM4_FLAG_UPDATE); } } Внутри IndicationTick(), собственно, мигание светодиодами и происходит, если необходимо. Все это вполне себе нормально работает, казалось бы. Софт-уарт устроен так. Используется два прерывания. Одно — прерывание от изменения состояния порта, ловит стартовый бит на прием. Другое — прерывание от TIM3, в котором происходит передача и прием. Порт работает полудуплексно (т.е. передаем команду — получаем ответ). Вот код его модуля: #include "swuart.h" #include "timing.h" #define SWUART_TXPORT GPIOD #define SWUART_TXPIN GPIO_PIN_5 #define SWUART_RXPORT GPIOD #define SWUART_RXPIN GPIO_PIN_6 // User must ensure calling service interrupt routine at exact intervals // of 1 bit of the dedicated baud rate #define BAUD 1667 #define HALF_BAUD 833 #define test_rx (SWUART_RXPORT->IDR & SWUART_RXPIN) #define set_tx (SWUART_TXPORT->ODR |= SWUART_TXPIN) #define clr_tx (SWUART_TXPORT->ODR &= ~SWUART_TXPIN) #define transmit_in_progress 0x80 // in progress mark #define receive_in_progress 0x08 // in progress mark #define receive_error 0x04 #define receive_buffer_overflow 0x02 #define receive_buffer_full 0x01 #define test_status(a) (swu_sts & a) #define set_status(a) (swu_sts |= a) #define clr_status(a) (swu_sts &= ~a) #define enable_rx_int {\ SWUART_RXPORT->CR2 |= (uint8_t)SWUART_RXPIN;\ } #define disable_rx_int {\ SWUART_RXPORT->CR2 &= (uint8_t)(~(SWUART_RXPIN));\ } const u8 MSK_TAB[8]= { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; u8 rx_bit, // counter of received bits tx_bit, // counter of transmited bits rx_buff, // receive byte buffer rx_data, // received byte register tx_data, // transmited byte register swu_sts; // SWUART status register u8 swutxbuf[64]; u8 swutxlen, swutxpos = 0; u8 swurxbuf[64]; u8 swurxpos = 0; u8 swuart_tx_u8(u8 B); u8 swuart_rx_u8(u8 *B); void swuart_txrx_timing(void); void swuart_rx_start(void); /* ------------- Interrupts ---------------- */ INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHandler, 15) { if (TIM3_GetFlagStatus(TIM3_FLAG_UPDATE)) { swuart_txrx_timing(); TIM3_ClearFlag(TIM3_FLAG_UPDATE); } } INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6) { // There is only one interrupt at Port D — from SW UART RX swuart_rx_start(); } /* ------------- Exported ------------------ */ void SwUInit(void) { GPIO_Init(SWUART_TXPORT, SWUART_TXPIN, GPIO_MODE_OUT_PP_HIGH_SLOW); GPIO_Init(SWUART_RXPORT, SWUART_RXPIN, GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY); TIM3_TimeBaseInit(TIM3_PRESCALER_1, BAUD); TIM3_ITConfig(TIM3_IT_UPDATE, ENABLE); TIM3_UpdateRequestConfig(TIM3_UPDATESOURCE_REGULAR); TIM3_Cmd(ENABLE); } u8 SwUTx(u8 len, u16 to) { u8 i = 0; for (; i < len; i++) { dswrx = to; while (swuart_tx_u8(swutxbuf[i]) == FALSE && dswrx > 0) {} if (dswrx == 0) break; } return i; } u8 SwURx(u16 to) { swurxpos = 0; dswrx = to; while (1) { while (swuart_rx_u8(&swurxbuf[swurxpos]) == FALSE && dswrx > 0) {} if (dswrx == 0) return swurxpos; swurxpos++; dswrx = 10; } } /* ------------- Private ------------------- */ u8 swuart_tx_u8(u8 B) { if (!test_status(transmit_in_progress)) { tx_data = b; // YES - initiate sending procedure tx_bit = 0; set_status(transmit_in_progress); return(TRUE); } else return(FALSE); // NO - no action (transmition in progress) } u8 swuart_rx_u8(u8 *B) { u8 res; if (test_status(receive_buffer_full)) { *b = rx_data; res = swu_sts & 0x0F; // return only rx part of status swu_sts &= ~0x0F; // clear all rx status bits // TIM4_Cmd(ENABLE); // WTF? Why? // enable_rx_int; // enable rx interrupt !!! return(res); } else return(FALSE); } void swuart_rx_start(void) { if (!test_status(receive_in_progress) & !test_status(transmit_in_progress)) { disable_rx_int; // Disable GPIO interrupt // TIM4_Cmd(DISABLE); // WTF? Why? // TIM3_Cmd(DISABLE); TIM3_SetCounter(HALF_BAUD); // Set timer 3 counter to half-baud TIM3_Cmd(ENABLE); rx_bit = 0; set_status(receive_in_progress); } } void swuart_txrx_timing(void) { if (test_status(transmit_in_progress)) // transmission is in progres now { switch (tx_bit) // begin of bit transmition { case 0: clr_tx; //start bit transmition break; case 9: set_tx; //stop bit(s) transmition break; case 10: clr_status(transmit_in_progress); break; default: if (tx_data & MSK_TAB[tx_bit-1]) set_tx; // data bits else clr_tx; // transmition }; tx_bit++; // next bit to transmit } // if (test_status(receive_in_progress)) // reception is in progres now { u8 rx_samp = test_rx; if (rx_bit == 0) // start bit! { if (rx_samp == 0) // correctly received, continue { rx_bit = 1; rx_buff = 0; } else // ? noise in start bit, find next one { enable_rx_int; clr_status(receive_in_progress); } } else { if (rx_bit <= 8) // bit <= 8, receive data bits { if (rx_samp) rx_buff |= MSK_TAB[rx_bit-1]; // set one in place if received one rx_bit++; } else // bit > 8, receive stop bit { if (rx_samp) // valid stop bit { if (!test_status(receive_buffer_full)) // end of receive { rx_data = rx_buff; // new byte in buffer set_status(receive_buffer_full); } else set_status(receive_buffer_overflow); // data overflow! } else { rx_data = 0x00; set_status(receive_error); } enable_rx_int; // wait next start bit clr_status(receive_in_progress); } } } } Софт-уарт, сам по себе, вроде-бы тоже работает без сбоев. А вот дальше — веселие. Когда софт-уарт и разносольный таймер начинают работать вместе, то при приеме уарта возникает куча ошибок и сбоев. Причем, опытным путем было выяснено, что чем больше и дольше выполняется обработчик прерывания разносольного таймера, тем больше сбоев возникает при работе уарта. Далее, подумал, что видимо уарту мешает длинношеее прерывание TIM4. Ну может же быть такое. По этому поводу решил снизить его (TIM4) приоритет вот таким образом: // Disable interrupts __disable_interrupt(); // Deinit all GPIOs !!! DeInitGPIO(); // Init indication InitIndication(); // Init timing subsys InitTiming(); // Init SW UART SwUInit(); // Init config subsys InitConfig(); // Init wiegand output InitWiegand(); // Configure interrupt priorities ITC_SetSoftwarePriority(ITC_IRQ_TIM4_OVF, ITC_PRIORITYLEVEL_1); //ITC_SetSoftwarePriority(ITC_IRQ_TIM3_OVF, ITC_PRIORITYLEVEL_3); //ITC_SetSoftwarePriority(ITC_IRQ_PORTD, ITC_PRIORITYLEVEL_2); // Enable interrupts __enable_interrupt(); И нифига не помогло! Причем, ошибок и сбоев стало поменьше, но они не исчезли. Но КАК? Ведь с пониженным приоритетом прерывание от TIM4 никак не должно пагубно влиять на прерывания софт-уарта? В результате, путем долгих экспериментов, прикрутил костыль, который вы можете видеть в коде софт-уарта. Он отключает прерывание от TIM4 на время приема символа и потом включает его обратно. В таком виде все работает. Но что происходит я никак не могу понять. Уже 2 дня бьюсь, и ничего... Может чей зоркий глаз или опыт поможет? Буду очень-очень признателен!
  9. Все, нашел косяк. Извиняюсь за возможный излишний гонор и благодарю за то, что заставили меня-таки усомниться в своей правоте :) Мой косяк заключался в том, что я совершенно упустил тот момент, что после семплирования АЦПшкой последнего (нулевого) бита по спаду, должен происходить еще один фронт на SCK, перед тем, как поднимется CS... Вот это и было фатально. Получалось, что часть логики АЦПшки отрабатывала (за канал А), а другая часть ожидала фронта, который так и не приходил... Второй косяк заключался в достаточно вольном трактовании разработчиком компилятора режимов SPI. Таким образом, как мне казалось, я пробовал режим 1 и режим 2, а на самом деле вместо режима 2 был режим 3 (а осциллографом в этот момент я, увы, не посмотрел — наблюдал активно и вымерял тайминги только в режиме 1). Почему я выбрал режим 1 не знаю. Видимо, смутило то, что свободное состояние SCK может быть нулевым и семплирование идет по спаду. Но необходимый при этом дополнительный импульс в конце я упустил :( В общем, установил я жестко битами в регистрах режим 2 и оно все заработало. Так что, еще раз огромное спасибо! Пойду переписывать штатный модуль SPI по нормальному... Да, за одно уж, на всякий случай: SPI.WriteByte делает первое, т.е. чекает, передает и снова чекает (и только потом передает управление назад). Так что там все стерильно, тем больее, на этот предмнет я осцилом смотрел внимательно (это было у меня самое первое предположение, что что-то, возможно, недопередается).
  10. Swordfish Basic Штатные модули работы с SPI под сомнение не ставим, ибо а) пробовал не использовать модули и делать на асме (с аюсолютно тем же результатом) и б) два других компонента на плате — ОЗУ и SD-карта отлично работают. И вообще все всегда работало. Проблема только с этим ЦАП. Program Test Device = 18F2550 Clock = 24 Config //8M crystal PLLDIV = 2, //4M for PLL USBDIV = 2, //48M use PLL/2 CPUDIV = OSC3_PLL4, //For PLL - 24M FOSC = HSPLL_HS, //HS with PLL VREGEN = ON, MCLRE = OFF, PWRT = ON, BOR = OFF, //!!! BORV = 2, //!!! WDT = OFF, WDTPS = 32 //128 msec //#option WDT = false Const ipLow = 1 Const ipHigh = 2 #option SPI_SCK = PORTB.1 #option SPI_SDI = PORTB.0 #option SPI_SDO = PORTC.7 Include "System" Include "Utils" Include "SPI" Dim ACT_LED As PORTB.5 Dim ADC_nCS As PORTC.2 ////////////////////////////////////////////////////////// Sub InitHW() //Set all ports to digital operation SetAllDigital() //Set port pins direction Output(ACT_LED) Output(ADC_nCS) //Deselect chip ADC_nCS = 1 End Sub Sub InitSPI() SPI.SetAsMaster(spiOscDiv16) //24M/16=1.5Mbps SPI.SetSample(spiSampleMiddle) //Default End Sub /////////////// Sub ADC_SetSPImode() SPI.Enabled = false SPI.SetClock(spiIdleLow, spiFallingEdge) //SPI mode 1 SPI.Enabled = true End Sub Sub ADC_Write(Data As Word) ADC_nCS = 0 SPI.WriteByte(Data.Byte1) SPI.WriteByte(Data.Byte0) ADC_nCS = 1 End Sub Sub ADC_Init() //Set 1.024 volts reference and Fast mode ADC_Write(%1001000000000001) End Sub Sub ADC_OutAB(A As Word, B As Word) Dim Temp As Word // //Write B to Buffer Temp = (B And $0FFF) Or %0001000000000000 ADC_Write(Temp) //Out A as A and Buffer as B Temp = (A And $0FFF) Or %1000000000000000 ADC_Write(Temp) End Sub //*********************************************** //************ Start of program ***************** //*********************************************** InitHW InitSPI // ACT_LED = 0 // ADC_SetSPImode() ADC_Init() //Main loop While True ADC_OutAB(4095, 4095) Delayms(100) Wend End Я так подозреваю, что следующим пунктом будут попрошены осциллограммы?
  11. Хорошо, что же тогда происходит? Да, про SPI. Два возможных режима, только те, которые можно использовать для работы с этой МС — 2 и 1. Но это не принципиально, пототму, что коммуникации работают нормально (команды-то она принимает).
  12. Блин, ну не просто так же спрашиваю человека, который "щупал". Ибо сам я со стажем и достаточно большим... Ну да ладно, раз так — значит так. Есть девайсина сабжевая (даташит, кому интересен вопрос, можно найти на сайте TI). Питается от 3.3 вольт, интерфейсится с МК по SPI. Я провожу стандартную по даташиту операцию: 1) конфигурирую опору на 1,024 вольта, используя встроенный опорник 2) пишу значение (пускай будет 2048) в буфер для канала Б 3) пишу значение в канал А (пускай, опять же, 2048) + эта же команда одновременно должна переносить значение из буфера в канал Б (типа, что бы синхронно все было) В результате имею положенные 1,024 вольта на выходе А и хрен с маслом на выходе Б... Непонятно. Если использую другую команду, которая выводит сразу в канал Б (плюс должна какбе сохранять это же значение в буфер), то на канале Б все шоколадно, как положено. Если после этого опять пишу в А + в Б из буфера, то снова получается картина описанная выше... Воркэраунд ввиде "сначала записать в А, а потом в Б разными командами" невозможен: при записи в один канал другой сбрасывается. Все данные вывожу строго по даташиту. Режим вывода пробовал и быстрый, и медленный. Режим SPI правильный (пробовал все 2 возможных), тайминги перемерил осциллографом — все четко, как у пацанов на районе... Создается впечатление, чо неправильно функционирует буфер на микросхеме (либо не читается, либо не пишется). Перепробовал 3 разных микросхемы из разных магазинов (по 400 рублей каждая + корпус SO, так что назад не вернуть, а ZIF-колодки нет). НО, видимо, толку мало, т.к. реально, походу, поставщик один и серия одна... В службе поддержки TI, мягко говоря, разбираться не сильно хотят — проект не промышленного масштаба, так что им на все это положить, по большому счету (делаю выводы из разговора со "спецом" их службы поддержки). Заказал в TI сэмплы. Придут нескоро. Проект уже, мягко говоря, подгорает... Вот такие непонятки.
  13. Доброй ночи. Честно говоря, не знаю в тот ли раздел написал (по ЦАП конкретного раздела не нашел)... В общем, нужен человек, руками щупавший сабжевый ЦАП. У меня с ним какие-то большие и очень странные непонятки...