Jump to content

G1KuL1N

Members
  • Content Count

    3721
  • Joined

  • Last visited

Posts posted by G1KuL1N


  1. Уважаемый MasterElectric я выше уже ответил по этому поводу, не спорю с таймером лучше, но если ценим процессорное время - юзаем аппаратный I2C, и нет больше никаких "самых лучших вариантов". Во-вторых когда мне понадобился срочно программный I2C, если-б я залез сюда на форум, наткнулся бы на  Ваш пост с программным I2C с таймерами и бит-бандингом, я бы включил его себе с мыслью: вот чел молодец какой,  выложил не поленился, спасибо ему. Так что как есть, так есть.

    • Upvote 1

  2. Это решение "в лоб", но работает, просто и быстро, написано за 20 минут так как горело, и с ходу рабочего решения не нашел. Задержку на таймере конечно лучше но необязательно, для ценителей программного времени там переделать 10 минут на таймер (хотя тот кто считает такты никогда в здравом уме не  будет использовать программный  i2C, когда есть аппаратный :D). На HAL так как это встроено в большую программу которая работает с HAL. Понадобилось просто подвесить в проект FRAM но уже все было готово и переделывать было бы долго и нудно. 


  3. В общем понадобилось тут подвесить FRAM к STM32, а пины аппаратных I2C были уже заняты, ну решил не менять пины, а добавить себе на вооружение на всякий, программный I2C. То что удалось нагуглить либо работало криво, либо приходилось допиливать и допиливать. Ну и написал свой с блекджеком и ш.. Так как в сети примеров мало программного I2C на STM32 то решил поделиться. Вдруг кому пригодится. Работает с библиотекой HAL, поправить нужно только под  свой камень и свои порты и все работает.

    I2C.h

    #ifndef __I2C_H_H__
    #define __I2C_H_H__
    // G1KuL1N
    // ПОДКЛЮЧИТЬ БИБЛИОТЕКУ СВОЕГО КОНТРОЛЛЕРА
    
    #include "stm32f4xx_hal.h"
    
    // В CUBE MX порты I2C настроить на выход (либо в main.c вручну подать тактирование на нужны GPIO) 
    
    //---подключение шины к пинам-----------------------------------------------------
    #define SCL_I HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_15);   
    #define SDA_I HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_14);
    #define SCL_O HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
    #define SDA_O HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET);
    //--------------------------------------------------------------------------------
    void i2c_init (void);               // Инициализация шины
    void i2c_start_cond (void);        // Генерация условия старт
    void i2c_restart_cond (void);      // Генерация условия рестарт
    void i2c_stop_cond (void) ;       // Генерация условия стоп  
    uint8_t i2c_send_byte (uint8_t data) ;      //Передать байт (вх. аргумент передаваемый байт) (возвращает 0 - АСК, 1 - NACK) 
    uint8_t i2c_get_byte (uint8_t last_byte) ;  //Принять байт (если последний байт то входной аргумент = 1, если будем считывать еще то 0)(возвращает принятый байт)
    //--------------------------------------------------------------------------------
    // ПРИМЕР ИСПОЛЬЗОВАНИЯ
    //=========================================================================================
    //   Запись uint16_t во внешнюю еепром (FRAM FM24CL64) или любой другой 24LC памяти, 
    //	 две ячейки,  указывается адрес первой ячейки, следующая идет adr++
    //=========================================================================================
    //
    //void FRAM_W_INT(uint16_t adr, uint16_t dat){
    //i2c_start_cond ();
    //i2c_send_byte (0xA2); //адрес чипа + что будем делать (записывать)
    //i2c_send_byte    ((adr & 0xFF00) >> 8);  
    //i2c_send_byte    (adr & 0x00FF);
    //i2c_send_byte    ((dat & 0xFF00) >> 8);  
    //i2c_send_byte    (dat & 0x00FF);
    //i2c_stop_cond();
    //}
    
    //=========================================================================================
    //   Считывание uint16_t из внешней еепром (FRAM FM24CL64) или любой другой 24LC памяти, 
    //	 две ячейки,  указывается адрес первой ячейки, следующая идет adr++
    //=========================================================================================
    //uint16_t FRAM_R_INT(uint16_t adr){
    //uint16_t dat;
    //i2c_start_cond ();
    //i2c_send_byte (0xA2);
    //i2c_send_byte    ((adr & 0xFF00) >> 8);  
    //i2c_send_byte    (adr & 0x00FF);
    //i2c_restart_cond ();
    //i2c_send_byte (0xA3);
    //dat =  i2c_get_byte(0);	
    //dat <<= 8; 
    //dat |= i2c_get_byte(1);
    //i2c_stop_cond();
    //return dat;
    //}
    
    // G1KuL1N
    
    #endif /* __I2C_H_H__ */

    i2C.c

    #include "I2C.h"
    
    volatile uint8_t i2c_frame_error=0; 
    
    //-----------------------------------------------------------
    __STATIC_INLINE void Delay_us (uint32_t __IO us) //Функция задержки в микросекундах us
    {
    us *=(SystemCoreClock/1000000)/5;
    	while(us--);
    }
    
    //----------------------------------------------------
    void SCL_in (void) //функция отпускания SCL в 1, порт на вход (необходимо установить используемый порт) 
    	{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    	}
    //----------------------------------------------------
    void SCL_out (void) //функция притягивания SCL в 0 (необходимо установить используемый порт) 
    	{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    	SCL_O;
    	}
    //----------------------------------------------------
    void SDA_in (void) //функция отпускания SDA в 1, порт на вход (необходимо установить используемый порт) 
    	{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    	}
    //----------------------------------------------------
    void SDA_out (void) //функция притягивания SDA в 0 (необходимо установить используемый порт) 
    	{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    	SDA_O
    	}
    
    //----------------------------------------------------
    void i2c_stop_cond (void)  // функция генерации условия стоп 
    {
        uint16_t SCL, SDA;
    		SCL_out(); // притянуть SCL (лог.0)
        Delay_us(10);
        SDA_out(); // притянуть SDA (лог.0)
        Delay_us(10);
    
        SCL_in(); // отпустить SCL (лог.1)
        Delay_us(10);
        SDA_in(); // отпустить SDA (лог.1)
        Delay_us(10);
        		
        // проверка фрейм-ошибки
        i2c_frame_error=0;		// сброс счётчика фрейм-ошибок
        SCL=SCL_I;
    		SDA=SDA_I;
    		if (SCL == 0) i2c_frame_error++;   // проберяем, чтобы на ноге SDA была лог.1, иначе выдаём ошибку фрейма
        if (SDA == 0) i2c_frame_error++;   // проберяем, чтобы на ноге SCL была лог.1, иначе выдаём ошибку фрейма
        Delay_us(40);
       }
    
    void i2c_init (void) // функция инициализации шины
    {
        i2c_stop_cond();   // стоп шины
        i2c_stop_cond();   // стоп шины
    }
    //----------------------------------------------------
    void i2c_start_cond (void)  // функция генерации условия старт
    {
    		SDA_out(); // притянуть SDA (лог.0)
        Delay_us(10);
        SCL_out(); // притянуть SCL (лог.0)
        Delay_us(10);
    }
    //----------------------------------------------------
    void i2c_restart_cond (void)   // функция генерации условия рестарт
    {
        SDA_in(); // отпустить SDA (лог.1)
        Delay_us(10);
        SCL_in(); // отпустить SCL (лог.1)
        Delay_us(10);
        SDA_out(); // притянуть SDA (лог.0)
        Delay_us(10);
        SCL_out(); // притянуть SCL (лог.0)
        Delay_us(10);
    }
    //----------------------------------------------------
    uint8_t i2c_send_byte (uint8_t data)  // функция  отправки байта  
    {   
     uint8_t i;
     uint8_t ack=1;           //АСК, если АСК=1 – произошла ошибка
    uint16_t SDA;   
    	for (i=0;i<8;i++)
        {
            if (data & 0x80) 
    				{
    				SDA_in(); // лог.1
            }
    				else 
    				{
    				SDA_out(); // Выставить бит на SDA (лог.0
    				}
            Delay_us(10);
            SCL_in();   // Записать его импульсом на SCL       // отпустить SCL (лог.1)
            Delay_us(10);
            SCL_out(); // притянуть SCL (лог.0)
            data<<=1; // сдвигаем на 1 бит влево
    					
        }
        SDA_in(); // отпустить SDA (лог.1), чтобы ведомое устройство смогло сгенерировать ACK
         Delay_us(10);
        SCL_in(); // отпустить SCL (лог.1), чтобы ведомое устройство передало ACK
         Delay_us(10);
        SDA=SDA_I;
    		if (SDA==0x00) ack=1; else ack=0;    // Считать ACK
    
        SCL_out(); // притянуть SCL (лог.0)  // приём ACK завершён
    
        return ack; // вернуть ACK (0) или NACK (1)   
    
    }
    //----------------------------------------------------
    uint8_t i2c_get_byte (uint8_t last_byte) // функция принятия байта
    {
     uint8_t i, res=0;
    	uint16_t SDA;
        SDA_in(); // отпустить SDA (лог.1)
    
        for (i=0;i<8;i++)
        {
            res<<=1;
            SCL_in(); // отпустить SCL (лог.1)      //Импульс на SCL
            Delay_us(10);
    				SDA_in();
    				SDA=SDA_I;
    				if (SDA==1) res=res|0x01; // Чтение SDA в переменную  Если SDA=1 то записываем 1
            SCL_out(); // притянуть SCL (лог.0)
            Delay_us(10);
        }
    
        if (last_byte==0){ SDA_out();} // притянуть SDA (лог.0)     // Подтверждение, ACK, будем считывать ещё один байт
        else {SDA_in();} // отпустить SDA (лог.1)                 // Без подтверждения, NACK, это последний считанный байт
        Delay_us(10);
        SCL_in(); // отпустить SCL (лог.1)
        Delay_us(10);
        SCL_out(); // притянуть SCL (лог.0)
        Delay_us(10);
        SDA_in(); // отпустить SDA (лог.1)
    
        return res; // вернуть считанное значение
    }
    

     

    • Upvote 3

  4. Вместо TL431 лучше TL1431. Михаил рекомендую посмотреть на ADR525 (550) по цене очень подъемные, я в такие регуляторы только их применяю последнее время. Да и генераторы я бы запитал от такого же регулятора

    • Upvote 1

  5. Ну да в таком случае шумодав не нужен. Блок питания по ссылке конечно для хайгеновых примочек не подходит ни разу. Соберите стабилизатор на 7809 или LM317. Если будете покупать все же новый БП главное что бы он был не импульсный, даже если на нем написано, что он стабилизированный.

    • Upvote 1

  6. Наткнулся на эту тему месяц назад. О JLH для наушников слышал но не обращал внимания, а вот схема 2005-го года меня заинтересовала, решил собрать ради интереса. Усь хороший, субъективно мне больше понравился всяких лехманов, панд и пр. на TPA и AD, даже звено от предварительного усилителя Вадима(waso) не так живо звучит, разве что бете22 проиграл. Недостаток один - это постоянка на выходе, которая лечиться интегратором, либо ждать, у меня есть усь по подобной топологии, так там защита отщелкивается через 15-20 минут после включения. Транзисторы BC550/560 2SC5171, ток покоя 140мА. Если кому нужно платку которую накидал добавил + пару фото.

    PCB.rar

    post-34627-0-71569300-1438884537.jpg

    post-34627-0-80869500-1438884553_thumb.jpg

    post-34627-0-37748100-1438884563_thumb.jpg


  7. Вот как раз, я только думал до этого ему такие же схемки подкинуть, только все равно воткнуть ADR525 для 5в и ADR530 для -12, соответственно резюки 8,9, 17,18 пересчитать.


  8. to scare1987 в рогове фнч на резисторе лучше заменить на Бесселя третьего порядка, 390пф, 2.7mH, 2100пф, звук гораздо лучше чем с резистором. Питание да лучше сделать как у Андронникова, референс-ОУ-транзистор, для цифры можно и 317/337

    • Upvote 1

  9. Спасибо. Была мысль про трансы, но в плане только думал места не хватит, а экономить на трансах 100 баксов, при общих затратах на него 3000 как то глупо. Единственно что лоханулся - плату фильтра когда разводил, морду с задницей перепутал) ну и результат виден :unknw:


  10. По идее под лотом с оригинальной в нашем понимании деталью должно быть написано - Genuine. Подделки китайцы часто подписывают - Original, у них свое понимание этого слова видимо синоним - клон или около того. У продавца по ссылке цены с Genuine ближе к реальности, чем Original. Ну и здравый смысл - микросхема которая стоит 5 баксов за штуку, не может стоить 1 бакс за 10шт у китайцев, это подделка.


  11. Есть дешевая китайская доставка вроде Econom int shipping трек не дают, как правило фришиппинг + если не дорогой товар, по рф трек ставят в любом случае. Иногда бывает китаец дает нормальный трек, а посылка приходит с российским треком, такого быть не должно, но почему то частенько происходит. На али продавец ОБЯЗАН сообщить трек причем не левый, за левый трек на али можно через 3 недельки открыть диспут и требовать деньги назад.


  12. После того как продавец выслал товар - ни от него , ни от покупателя уже ничего не зависит . Все задержки с доставкой уже только на совести почтовых служб . Так что если не доставили в установленный продавцом срок - продавец не виноват .

    Еще как виноват. На Ebay срок 45 дней, через 40 дней уже можно открывать диспут. На али продаван ОБЯЗАН указать трек, трек не трекается, или дан трек местной китайской службы доставки - тоже сразу можно открывать диспут. Ответственность за доставку полностью висит на продавце.

    • Upvote 1

  13. В элитане данные кондеры будут не менее 1000р за штуку, и 98% это будет перепродажа из фарнелла, есессно с нехилой накруткой. По сылкам смотри отзывы по продавцу, затем есть ли эти кондеры с такими размерами для данной серии в рубиконовских даташниках, цена в принципе соответствует. Ниппоны я покупал у этого продавца

    http://www.ebay.com/...haelwalther1946

    настоящие, у него же покупал пленку ICEL PHC - тоже оказались оригиналы.

    Простой пример

    Фарнелл - EPCOS B41456 - 10000мкф 63в 16 евро, доставка 2 - 3 дня, оригинал 100%

    http://ru.farnell.co...crew/dp/4704733

    Элитан - он же, почти 35 евро, срок отгрузки 15 дней означает - что его продадут как раз из фарнелл или диджикей с накруткой 100-150%, итоговая доставка около месяца

    http://www.elitan.ru...eley=-1&mfg=all

    ебей - 14 евро, доставка около месяца, это как раз и есть небольшой европейский магаз компонентов, выкладывающий свой ассортимент на eбей, вероятность оригинала близка к 100%

    http://www.ebay.com/...=item35b777fbf9

    • Upvote 1
×
×
  • Create New...