Jump to content

    

mr_smit

Участник
  • Content Count

    62
  • Joined

  • Last visited

Everything posted by mr_smit


  1. Фраза из даташита: "Valid Output With as Little as 50 mV Input Voltage Difference". Только боюсь уровни у неё не те.
  2. Нет. Нужна и передача. Припаялся к ножкам Tx и Rx микросхемы HA12241FP внутри магнитолы. На выходе прекрасный сигнал 0-5 В. Пока вижу 2 варианта: 1. Выпаять трансивер из чейнджера. Чейнджер в мусор. 2. Найти аналог HA12241FP. Уж за 12 лет должны были что то подобное придумать. Хотя кто знает.
  3. В магнитоле для этого используется микросхема HA12241FP. Даташита на неё не нашел, нашел только на HA12240FP. Разница только в одной цифре, но смысл думаю тот же: datasheet_HA12240FP.pdf Это драйвер шины с токовым выходом! Какой современный аналог взять? Не могу найти. P.S. В 2003 году такой CD эмулятор собирали, но там использовали схему на компараторе для чтения данных. Я её тоже навесным монтажом собрал, подключил и вот: Но хочется принимать и передавать через одну микросхему. Подскажите какую взять?
  4. Ради спортивного интереса решил сделать эмулятор CD чейнджера для своей старенькой магнитолы Pioneer 88. Посмотрел обмен на шине. Там похоже CAN шина: Амплитуда сигнала 100 мВ. Как этот сигнал привести к уровню 0-5 или 0-3.3 вольта? Т.е. вот тут амплитуда 1 вольт: А у меня 100 мВ. Пробовал трансивер TJA1050, но он на выходе дает TTL сигнал амплитудой 200 мВ. Естественно ни логический анализатор ни контроллер не воспринимает этот уровень. Как получить 0-5 В ?
  5. И всё равно я не могу передать изображение :( Взял png изображение размером 2179 байт. Открыл через HEX редактор. Создал массив байт: const char Img [2179] = { 0x89,0x50,0x4E,0x47,0x0D... ... }; И пробую передать по запросу в браузер. В состоянии http_state[sn]==HTTP_IDLE формирую заголовок: if(strcmp(url,"/test.png")==0) { strcpy((char*)buf,http_200); strcat((char*)buf, http_server); strcat((char*)buf,"Connection: close\r\n"); strcat((char*)buf,"Content-Length: "); itoa(sizeof(Img),str); strcat((char*)buf,str); strcat((char*)buf,"\r\n"); strcat((char*)buf,"Content-Type: image/png\r\n"); strcat((char*)buf, http_header_end); header_sz=strlen((char*)buf); http_state[sn]=HTTP_SENDING; } В состоянии http_state[sn]==HTTP_SENDING отправляю изображение по частям: if(http_state[sn]==HTTP_SENDING) { ret = send(sn,buf,header_sz); // заголовок ret = send(sn,&Img[0],2048); // первые 2048 байт изображения ret = send(sn,&Img[2048],130); // остаток HTTP_reset(sn); disconnect(sn); } В итоге при обращении по адресу 192.168.1.25/test.png браузер показывает изображение, но только эти первые 2048 байт. Последние байты не отображаются. Т.е. не передаются. Я не понимаю почему так. Хоть убейте. Почему при вызове функции send второй раз она ничего не передает??
  6. Вы уже столько кода привели что в каждую строчку не вникнешь. Я говорил про саму идею реализации. Где возможны грабли. Если вы это всё уже учли, то это хорошо. Надо дальше искать. P.S. Тем не менее не понимаю почему бы не подключить бортовик к зажиганию и не морочить дальше голову.
  7. Поддержу. Это бы желательно проверить. Типо обрыв это нифига не выкл/вкл. После включения ЭБУ как минимум 300 мс "запускается". Об этом даже в протоколе говорится. Нельзя раньше 300 мс после включения ничего слать. Поэтому, возможно, вы просто не выжидаете эти 300 мс и делаете сброс, а пока инициализация STM-ки закончится, тут уже и ЭБУ просыпается. Сколько ваши "5 таймаутов" длятся? Включайте свою поделку одновременно с зажиганием. Я, в своё время, просто от замка зажигания запитал бортовик и всё. Включили зажигание - подключились, показали параметры. Выключили зажигание - бортовик потух. Один хрен ЭБУ выходит на связь только при включенном зажигании. К чему весь этот велосипед с "делаю ресет".
  8. Да, подзабыл. Судя по всему то что работает это чистая случайность. Никаких обрывов быть не должно. Не знаю как там у японцев, но я когда бортовик себе под BOSCH делал - никаких обрывов не было. Связь очень стабильная. Мне кажется вы что то перемудрили с USARTом оттого и глючит. Ну вот элементарно: Usart_Send_symbol(0x70, KLINE_UART); вставлять это в прерывании, мягко говоря, не правильно. Ни на AVR ни на STM32. А это что? void UART4_IRQHandler() { ... if(USART_GetITStatus(UART4, USART_SR_ORE) == SET) { USART_ReceiveData(UART4); } } Я бы так сделал: #define Connect 1 #define ReadData 2 int mode; #define BUFFER_SIZE 200 unsigned char buffer[BUFFER_SIZE]; // приемный буфер volatile unsigned char counter; // счетчик принятых байт // прерывание USART if если байт успешно приняли { buffer[counter] = data; // положили его в буфер if (++counter == BUFFER_SIZE) { counter = 0; } } void main(void) { ... while (1) { switch (mode) // смотрим в каком режиме находимся { case Connect: // если только что включились => подключаемся к ЭБУ // // если всё хорошо // mode = ReadData; // переходим в режим чтения информации case ReadData: // // отправляем -> читаем // } } } В прерывании USART надо только положить байт в буфер и больше ничего. P.S. А вообще можно и обычный Init сделать и не заморачиваться с этим fast 5 baud. Единственное старые мозги могут его не поддерживать. Ну ооочень старые. И тогда всё сведется к тому что надо будет дрыгнуть ногой и потом отослать строчку вида 81 10 f1 81 03 на нормальной скорости 10400 и потом на ней же работать. Только адрес ЭБУ подобрать (0-255). На каком откликнется с тем и работать. Я вот с Relault Logan такой финт хочу сделать, только всё руки не доходят.
  9. В обработчике прерывания от USART надо сбрасывать флаг прерывания: void UART4_IRQHandler() { uint8_t data; // portBASE_TYPE xStatus; if((UART4->SR & USART_SR_RXNE)) { UART4->SR&=~USART_SR_RXNE; // сбрасываем флаг прерывания data = UART4->DR; ...... Опечатка: не USART4->SR..., а UART4->SR... в вашем случае. Поправил.
  10. Выходит надо учитывать переменную ret. Это число реально переданных байт. И в зависимости от неё двигать указатель в буфере отправки buf при посылке следующей части. Но вопрос о прикреплении заголовка к каждой части посылки остается открытым.
  11. Так я его исходник и правлю. Функция Send, как я понимаю, сама следит за передающим буфером: int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) { uint8_t tmp=0; uint16_t freesize=0; CHECK_SOCKNUM(); CHECK_SOCKMODE(Sn_MR_TCP); CHECK_SOCKDATA(); tmp = getSn_SR(sn); if(tmp != SOCK_ESTABLISHED && tmp != SOCK_CLOSE_WAIT) return SOCKERR_SOCKSTATUS; if( sock_is_sending & (1<<sn) ) { tmp = getSn_IR(sn); if(tmp & Sn_IR_SENDOK) { setSn_IR(sn, Sn_IR_SENDOK); #if _WZICHIP_ == 5200 if(getSn_TX_RD(sn) != sock_next_rd[sn]) { setSn_CR(sn,Sn_CR_SEND); while(getSn_CR(sn)); return SOCKERR_BUSY; } #endif sock_is_sending &= ~(1<<sn); } else if(tmp & Sn_IR_TIMEOUT) { close(sn); return SOCKERR_TIMEOUT; } else return SOCK_BUSY; } freesize = getSn_TxMAX(sn); if (len > freesize) len = freesize; // check size not to exceed MAX size. while(1) { freesize = getSn_TX_FSR(sn); tmp = getSn_SR(sn); if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) { close(sn); return SOCKERR_SOCKSTATUS; } if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY; if(len <= freesize) break; } wiz_send_data(sn, buf, len); #if _WIZCHIP_ == 5200 sock_next_rd[sn] = getSn_TX_RD(sn) + len; #endif setSn_CR(sn,Sn_CR_SEND); /* wait to process the command... */ while(getSn_CR(sn)); sock_is_sending |= (1 << sn); return len; } А отправляет он так: if(fs[sn].fsize != sentsize[sn]) { f_read(&fs[sn], &buf[header_sz], DATA_BUF_SIZE-header_sz, &blocklen); ret = send(sn,buf,blocklen+header_sz); if(ret < 0) { f_close(&fs[sn]); close(sn); return ret; } sentsize[sn] += ret; // Don't care SOCKERR_BUSY, because it is zero. } Читает с карты 2048 байт минус размер HTTP заголовка (DATA_BUF_SIZE-header_sz). А отправляет по факту каждый раз 2048 байт (blocklen+header_sz) кроме последней итерации. Сейчас только заметил blocklen+header_sz. Может надо HTTP заголовок отправлять с каждым куском данных??? Я то сейчас отправляю заголовок, а потом просто куски картинки. А у него в буфере каждый раз оказывается заголовок + новая порция считанных данных &buf[header_sz]. Правильно?
  12. Сделал так: ret = send(sn,buf,size); // отправляем заголовок ret = send(sn,(char*)Img1,sizeof(Img1)); // картинка по частям ret = send(sn,(char*)Img2,sizeof(Img2)); // ret = send(sn,(char*)Img3,sizeof(Img3)); // disconnect(sn); в итоге загружается только первая треть картинки или даже меньше:
  13. int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) Я пока никак не пойму можно ли большой массив передать порциями по 2 КБ. В смысле поддерживает само железо такой финт или нет. Но судя по всему поддерживает, ведь человек из вышеприведенной статьи как то загружает сайт с SD карточки.
  14. Речь о версии 2.0.2. Тоже столкнулся с этой проблемой. Где галочки ставить что я подключаю библиотеки USART, SPI и т.д.
  15. В общем работают оба способа. Если при запросе картинки отдать сначала заголовок, а потом сырые данные картинки, то она отображается. ret = send(sn,buf,size); ret = send(sn,(char*)Img, sizeof(Img)); Так же можно вставить картинку в кодировке base64 непосредственно в html код страницы. const char site[] = "<html>" "<head>" "<title>Умный дом</title>" "<meta http-equiv='content-type' content='text/html; charset=windows-1251'>" "</head>" "<body>" "<br><br><br><center><b>Тестовая страница W5500</b></center><br>" "<center><img src='data:image/png;base64," "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A" "/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB98FCg4BIKAKV80AAAAZdEVYdENv" "bW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAKElEQVQI102LQQ4AMAjCqP//cz0Y3bg0lEAS" "NZtSgddnP1WDU/xnoAGOzg8GbihEeAAAAABJRU5ErkJggg==" "'></center>" "</body>" "</html>"; В этом случае при запросе страницы она открывается корректно с картинкой. Но когда я взял картинку размером 5 КБ, то страница не открывается. Постоянно висит ожидание. Размер передающего буфера 2 КБ. Т.е. надо разбить данные на блоки. Вот это место: ... sentsize[sn]=0; ... if(http_state[sn]==HTTP_SENDING) { while (sentsize[sn] < size) { ret = send(sn,buf+sentsize[sn],size-sentsize[sn]); if(ret < 0) { close(sn); return ret; } sentsize[sn] += ret; // Don't care SOCKERR_BUSY, because it is zero. } HTTP_reset(sn); disconnect(sn); } ret длина реально отправленных данных. Опять же не уловлю в чем проблема.
  16. В бинарном. Я посмотрел, браузер получает картинки в чистом виде. Для этого указывается тип (image/png, image/jpg и т.д.) и количество байт. Хотя черт его знает: Надо попробовать в base64 конвертнуть и strcat-ом приклеить.
  17. strcat((char*)buf, http_header_end); // Заголовок... и всё, что до него. size=strlen((char*)buf); // Текущий размер строк в буфере memcpy((char*)buf,Img[0]*, sizeof(Img)); // Копируем картинку в буфер. size += sizeof(Img); // Увеличиваем на размер картинки. А в таком случае разве memcpy не затрет buf? И в buf будет только сама картинка без заголовков? Может отправить сначала заголовок, а затем картинку? ret = send(sn,buf, strlen(buf)); ret = send(sn, Img, sizeof(Img));
  18. Точно. Похоже на правду. Спасибо! Проверить, к сожалению, смогу только вечером.
  19. Прикупил у китайцев плату с чипом W5500. Это обновленная версия Ethernet чипа W5100. Подключил к STM32 Discovery. За основу взял эту статью: http://we.easyelectronics.ru/GYUR22/w5500s...web-server.html. Убрал функции работы с SD картой и скомпилировал всё это в CooCox. Сервер заработал. Т.е. отдает в браузер статичный текст. Хочу добавить на html страницу картинку. Для теста сделал PNG размером 5х5 пикселей. Добавил её в html код: <html> <head> <title>Умный дом</title> <meta http-equiv='content-type' content='text/html; charset=windows-1251'> </head> <body> <br><br><br><center><b>Тестовая страница W5500</b></center><br> <center><img src='test.png'></center> </body> </html> Открыл картинку в hex редакторе и сделал массив сырых данных: const char Img [205] = { 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, 0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x05,0x08,0x02,0x00,0x00,0x00,0x02,0x0D,0xB1,0xB2,0x00,0x00,0x00, 0x01,0x73,0x52,0x47, 0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00,0x00,0x06,0x62,0x4B,0x47,0x44,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0xA0,0xBD,0xA7,0x93,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0B,0x13, 0x00,0x00,0x0B,0x13, 0x01,0x00,0x9A,0x9C,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4D,0x45,0x07,0xDF,0x05, 0x0A,0x0E,0x01,0x20, 0xA0,0x0A,0x57,0xCD,0x00,0x00,0x00,0x19,0x74,0x45,0x58,0x74,0x43,0x6F,0x6D,0x6D, 0x65,0x6E,0x74,0x00, 0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4D, 0x50,0x57,0x81,0x0E, 0x17,0x00,0x00,0x00,0x28,0x49,0x44,0x41,0x54,0x08,0xD7,0x4D,0x8B,0x41,0x0E,0x00, 0x30,0x08,0xC2,0xA8, 0xFF,0xFF,0x73,0x3D,0x18,0xDD,0xB8,0x34,0x94,0x40,0x12,0x35,0x9B,0x52,0x81,0xD7, 0x67,0x3F,0x55,0x83, 0x53,0xFC,0x67,0xA0,0x01,0x8E,0xCE,0x0F,0x06,0x6E,0x28,0x44,0x78,0x00,0x00,0x00, 0x00,0x49,0x45,0x4E, 0x44,0xAE,0x42,0x60,0x82 }; А в функции tcp_http_mt добавил реакцию на запрос картинки. Т.е. при ответе к HTTP заголовку приклеиваем сырые данные картинки. В итоге запрос на картинку в браузере идет, но сервер её не отдает. При этом браузер получает заголовки ответа. Но самого изображения нет. От безысходности установил HTTP снифер Wireshark. Удалось выяснить, что при передаче картинки сервер отправляет только её первые 8 байт. И на этом всё. 3-й день бьюсь. Не понимаю почему так происходит. Или где то функцию отправки надо изменить или с размером передаваемых данных что то не то. Гуглил и по W5100 и по W5200 и по W5500, но именно как передать изображение не нашел. web_discovery_w5500_sd.zip Может есть у кого какие идеи?
  20. SN761664 не подходит по числу команд, SN761677 очень похожа, такие же команды, 38-ми выводной корпус. Но настройки диапазона VHF-L / VHF-H / UHF опять не сходятся. НТВ (263,25 МГц):
  21. Нашел какой то польский проект на этом тюнере. Там приводится описание как общаться с тюнером. 5240.pdf Вставил тюнер в компьютер, установил драйвер, программу просмотра. Подключился к сигнальным линиям SCL и SDA при помощи логического анализатора. И начал переключать каналы. СТС: Т.е. на тюнер передается посылка из 5 байт согласно описания: 1. Адрес тюнера - 11000010 - всё правильно (как в "даташите"); 2. 00010000 - настройка частоты; 3. 11100010 - настройка частоты; 4. 11001110 - настройка тюнера; 5. 00000010 - настройка диапазона; число N = 0001000011100010 = 4322 Шаг перестройки гетеродина 62,5 кГц, ПЧ 38,9 МГц, частота гетеродина 231.25+38.9=270.15 МГц, 270150 / 62,5 = 4322. Для СТС всё верно. Проблема в том что не совпадает настройка диапазона. По всем каналам. Вообще не совпадает с описанием. Т.е. последний байт в настройке задается как то по другому. В общем лелею надежду на даташит или хотя бы название микросхемы.
  22. Приобрел за копейки старенький тюнер AVerTV Studio 307 с целью помучить. В нем установлен ВЧ блок Philips FM1256/IH-3. Во всех обзорах уж дюже нахваливают его. Даташита на сам тюнер не нашел. Всё обыскал. Сняв крышку с ВЧ блока, обнаружил там микросхему без внятных опознавательных знаков (см. фото). Маркировка B2 G0542. Что это может быть? Получается она отвечает и за TV и за FM. Может кто то поделится даташитом. P.S. Цель: управлять тюнером с контроллера по I2C.
  23. Полевики похоже на обратной стороне платы. Туда не добраться. Зато я понял как магнитола общается с тюнером. Магнитола посылает по UART следующую последовательность: 25 08 80 30 9B C8 08 B8. Где: 25 08 - не изменяемый адрес тюнера. 80 - Address byte (ADB) 30 - Divider byte 1 (DB1) 9В - Divider byte 2 (DB2) С8 - Control byte (CB) 08 - Bandswitch byte (BB) В8 - контрольная сумма Байты настроек согласно даташиту на SN761678. И сам тюнер магнитоле ничего не отвечает похоже. Магнитола ждет пока появится видео сигнал на входе. Нет сигнала - дальше настраивает. Причем перебирает частоты четко по таблице http://www.telesputnik.ru/archive. Никакого автопоиска. Я так и не смог поймать хоть один байт от тюнера к магнитоле. Видно навигатор понимает сигнал только в формате PAL. А покупать/делать конвертер SECAM->PAL дороговато. Так что тюнер отправляется на полку.
  24. В общем не получится использовать этот тюнер отдельно от магнитолы. При подключении тюнера к магнитоле - изображение на магнитоле цветное, а на навигаторе черно-белое с красными короткими полосками. Видно дополнительный декодер цветности стоит в магнитоле. При настроенном канале на выводе AFT напряжение 1,37 - 1,48 вольта (меняется от канала к каналу). При поиске - 4,58 В. Кстати, канал СТС тюнер не находит с магнитолы :) Видно не просто так у меня помехи при приеме :) Это думаю уже несовершенство самого тюнера. В общем тему можно закрывать. Огромное всем спасибо за помощь! Узнал много нового!