Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » STM32 » I2C


I2C

Сообщений 31 страница 41 из 41

31

На счет ssd1306. Что делать с символами? На каких нибудь hd44780 в контроллере уже есть собственные символы и с ним все понятно. На ssd1306 такого нет, пришлось вручную вырисовывать несколько букв.  Для этого контроллера необходимо прописать все шрифты вручную или есть вариант конвертации?

32

Mars36 написал(а):

На счет ssd1306. Что делать с символами?

Беглый просмотр даташитки на этот контроллер показал, что это обычный контроллер дисплея с растровой графикой. В нем нет встроенного генератора символов. Это значит, что контроллер пользователя должен сам рисовать все пиксели, в том числе и шрифты буковок.

Отредактировано MasterAlexei (2019-06-01 22:44:44)

33

полюбому что-то типа этого

Код:
extern uint8_t buff[];
volatile _Bool change_ram_tic;
void str_to_ram(uint16_t adr, char *str, _Bool type)
{
     const char sym[][6] = 
  {
 //0x20 и далее (0x00-0x60)
    {0x00,0x00,0x00,0x00,0x00,0x00},                    //пробел
    {0x00,0x00,0x4f,0x00,0x00,0x00},                    //!
    {0x00,0x07,0x00,0x07,0x00,0x00},                    //"
    {0x14,0x7f,0x14,0x7f,0x14,0x00},                    //#
    {0x24,0x2a,0x7f,0x2a,0x12,0x00},                    //$
    {0x23,0x13,0x08,0x64,0x62,0x00},                    //%
    {0x36,0x49,0x55,0x22,0x40,0x00},                    //&
    {0x00,0x05,0x03,0x00,0x00,0x00},                    //,
    {0x00,0x1c,0x22,0x41,0x00,0x00},                    //(
    {0x00,0x41,0x22,0x1c,0x00,0x00},                    //)
    {0x14,0x08,0x3E,0x08,0x14,0x00},                    //*
    {0x08,0x08,0x3E,0x08,0x08,0x00},                    //+
    {0x00,0x50,0x30,0x00,0x00,0x00},                    //,
    {0x08,0x08,0x08,0x08,0x08,0x00},                    //-
    {0x00,0x60,0x60,0x00,0x00,0x00},                    //.
    {0x20,0x10,0x08,0x04,0x02,0x00},                    ///
    {0x3e,0x51,0x49,0x45,0x3e,0x00},                    //0
    {0x00,0x42,0x7f,0x40,0x00,0x00},                    //1
    {0x42,0x61,0x51,0x49,0x46,0x00},                    //2
    {0x21,0x41,0x45,0x4b,0x31,0x00},                    //3
    {0x18,0x14,0x12,0x7f,0x10,0x00},                    //4
    {0x27,0x45,0x45,0x45,0x39,0x00},                    //5
    {0x3c,0x4a,0x49,0x49,0x30,0x00},                    //6
    {0x01,0x71,0x09,0x05,0x03,0x00},                    //7
    {0x36,0x49,0x49,0x49,0x36,0x00},                    //8
    {0x06,0x49,0x49,0x29,0x1e,0x00},                    //9
    {0x00,0x36,0x36,0x00,0x00,0x00},                    //:
    {0x00,0x56,0x36,0x00,0x00,0x00},                    //;
    {0x08,0x14,0x22,0x41,0x00,0x00},                    //<
    {0x14,0x14,0x14,0x14,0x14,0x00},                    //=
    {0x00,0x41,0x22,0x14,0x08,0x00},                    //>
    {0x02,0x01,0x51,0x09,0x06,0x00},                    //? 
    {0x32,0x49,0x71,0x41,0x3e,0x00},                    //@
    {0x7e,0x11,0x11,0x11,0x7e,0x00},                    //A
    {0x7f,0x49,0x49,0x49,0x36,0x00},                    //B
    {0x3e,0x41,0x41,0x41,0x22,0x00},                    //C
    {0x7f,0x41,0x41,0x22,0x1c,0x00},                    //D
    {0x7f,0x49,0x49,0x49,0x41,0x00},                    //E
    {0x7f,0x09,0x09,0x09,0x01,0x00},                    //F
    {0x3e,0x41,0x49,0x49,0x3a,0x00},                    //G
    {0x7f,0x08,0x08,0x08,0x7f,0x00},                    //H
    {0x00,0x41,0x7f,0x41,0x00,0x00},                    //I
    {0x20,0x40,0x41,0x3f,0x01,0x00},                    //J
    {0x7f,0x08,0x14,0x22,0x41,0x00},                    //K
    {0x7f,0x40,0x40,0x40,0x40,0x00},                    //L
    {0x7f,0x02,0x0c,0x02,0x7f,0x00},                    //M
    {0x7f,0x04,0x08,0x10,0x7f,0x00},                    //N
    {0x3e,0x41,0x41,0x41,0x3e,0x00},                    //O
    {0x7f,0x09,0x09,0x09,0x06,0x00},                    //P
    {0x3e,0x41,0x51,0x21,0x5e,0x00},                    //Q
    {0x7f,0x09,0x19,0x29,0x46,0x00},                    //R
    {0x46,0x49,0x49,0x49,0x31,0x00},                    //S
    {0x01,0x01,0x7f,0x01,0x01,0x00},                    //T
    {0x3f,0x40,0x40,0x40,0x3f,0x00},                    //U
    {0x1f,0x20,0x40,0x20,0x1f,0x00},                    //V
    {0x3f,0x40,0x70,0x40,0x3f,0x00},                    //W
    {0x63,0x14,0x08,0x14,0x63,0x00},                    //X
    {0x07,0x08,0x70,0x08,0x07,0x00},                    //Y
    {0x61,0x51,0x49,0x45,0x43,0x00},                    //Z
    {0x00,0x7F,0x41,0x41,0x00,0x00},                    //[
    {0x02,0x04,0x08,0x10,0x20,0x00},                    /*\*/ 
    {0x00,0x41,0x41,0x7F,0x00,0x00},
    //]
    {0x02,0x00,0x1C,0x22,0x22,0x00},                    //^
    
    {0x40,0x40,0x40,0x40,0x40,0x00},                    //_    
    {0x00,0x01,0x02,0x04,0x00,0x00},                    //'
    {0x20,0x54,0x54,0x54,0x78,0x00},                    //a
    {0x7F,0x48,0x44,0x44,0x38,0x00},                    //b
    {0x38,0x44,0x44,0x44,0x20,0x00},                    //c
    {0x38,0x44,0x44,0x48,0x7F,0x00},                    //d
    {0x38,0x54,0x54,0x54,0x18,0x00},                    //e
    {0x08,0x7E,0x09,0x01,0x02,0x00},                    //f
    {0x0C,0x52,0x52,0x52,0x3E,0x00},                    //g
    {0x7F,0x08,0x04,0x04,0x78,0x00},                    //h
    {0x00,0x44,0x7D,0x40,0x00,0x00},                    //i
    {0x20,0x40,0x44,0x3D,0x00,0x00},                    //j
    {0x7F,0x10,0x28,0x44,0x00,0x00},                    //k
    {0x00,0x41,0x7F,0x40,0x00,0x00},                    //l
    {0x7C,0x04,0x18,0x04,0x78,0x00},                    //m
    {0x7C,0x08,0x04,0x04,0x78,0x00},                    //n
    {0x38,0x44,0x44,0x44,0x38,0x00},                    //o
    {0x7C,0x14,0x14,0x14,0x08,0x00},                    //p
    {0x08,0x14,0x14,0x18,0x7C,0x00},                    //q
    {0x7C,0x08,0x04,0x04,0x08,0x00},                    //r
    {0x48,0x54,0x54,0x54,0x20,0x00},                    //s
    {0x04,0x3F,0x44,0x40,0x20,0x00},                    //t
    {0x3C,0x40,0x40,0x20,0x7C,0x00},                    //u
    {0x1C,0x20,0x40,0x20,0x1C,0x00},                    //v
    {0x3C,0x40,0x30,0x40,0x3C,0x00},                    //w
    {0x44,0x28,0x10,0x28,0x44,0x00},                    //x
    {0x0C,0x50,0x50,0x50,0x3C,0x00},                    //y
    {0x44,0x64,0x54,0x4C,0x44,0x00},                    //z
    {0x00,0x08,0x36,0x41,0x00,0x00},                    //{
    {0x00,0x00,0x7f,0x00,0x00,0x00},                    //|
    {0x00,0x41,0x36,0x08,0x00,0x00},                    //}
    {0x02,0x01,0x02,0x02,0x01,0x00},                    //~
    {0x00,0x00,0x00,0x00,0x00,0x00},                    //резерв
};
	while( *str != 0){
          char nsim = *str++;
          nsim = nsim - 0x20;
          for( uint8_t j = 0; j <= 5; j++){
            if(type==0){
              buff[adr++] = sym[nsim][j];
            }
            else{
              buff[adr++] = ~(sym[nsim][j]);
           }
    	 }
   }
}

6-ой символ можно убирать - это разделитель, не всегда нужен. _Bool type флаг инверсии, заполнение 0 | 1 .

Отредактировано RA (2019-06-03 00:21:31)

34

Mars36 написал(а):

есть вариант конвертации?

Google -> TheDotFactory

35

Мучаюсь с TM1637. Что-то не выходит: у этих засранцев периодически надо повторять стартовые биты. ОК, биты у меня повторяются. Но засада с отправкой первого байта (который в нормальном I2C - адрес + бит направления), у меня почему-то младший бит всегда равен нулю, что бы я ни писал в  I2C1->CR2.

Код:
uint8_t write_i2c(const uint8_t *commands, uint8_t nbytes){
    uint32_t cntr;
    I2C1->CR2 = (nbytes-1)<<16 | commands[0]|  I2C_CR2_AUTOEND ;
    // now start transfer
    I2C1->CR2 |= I2C_CR2_START;
    for(uint8_t i = 1; i < nbytes; ++i){
        while(!(I2C1->ISR & I2C_ISR_TXIS)){ // ready to transmit
            cntr = Tms;
            if(I2C1->ISR & I2C_ISR_NACKF){
                I2C1->ICR |= I2C_ICR_NACKCF;
                return 0;
            }
            if(Tms - cntr > I2C_TIMEOUT) return 0;
        }
        I2C1->TXDR = commands[i]; // send data
    }
    return 1;
}

36

Eddy_Em написал(а):

Мучаюсь с TM1637

Выкинь и купи TM1638 )
Вообще, истории "успеха" с stm32 мне напоминают Жванецкого

Консерватория, аспирантура, мошенничество, афера, суд, Сибирь.
Консерватория, частные уроки, еще одни частные уроки, зубные протезы, золото, мебель, суд, Сибирь.
Консерватория, концертмейстерство, торговый техникум, зав. производством, икра, крабы, валюта, золото, суд, Сибирь.
Может, что-то в консерватории подправить?

37

TM1638 в полтора раза дороже. И не факт, что там "правильный" SPI, а не какое-нибудь китайское Г.
Ничего, поколупаюсь под пивас — сегодня мракобесский праздник, так что я на работе только 2 часа поторчал, дальше если жена уборку не затеет, можно будет поковыряться с I2C. Возможно, я какой-то флаг упустил, что у меня младший бит не устанавливается в "адресе".

38

stm32f030 - кто нибудь передавал по dma больше 255 байт? натыкаюсь на такой косяк, что dma толкнул и надо ожидать флаг TCR: Transfer Complete Reload, чтобы перезагрузить значение NBYTES: Number of bytes. и в чем тогда прикол dma? можно Half transfer interrupt сделать, но в моем случае криво это будет. общий объем передачи 512 байт, одна отправка 255 - 1(двух байтов до половинки не дотягиваю), т.е. надо еще и это как то обыграть. как?
ssd1306 128*32.
хочется то чтобы массив/строку заполнил dma толкнул и забыл. но не тут то было...

принял решение разбить передачу массива на три 4, так удобнее, передачи по dma. реализую - будем посмотреть.

Отредактировано RA (2019-06-18 12:13:13)

39

vt написал(а):

Выкинь и купи TM1638

А что с ТМ1637 не так??? У меня ещё пара ТМ1618 валяется... Взял за копейки недавно в местном ларьке через дорогу... да руки не доходят... летняя лень...

Вообще, истории "успеха" с stm32 мне напоминают Жванецкого

Ну да... Святой ногодрых... "дрыг, дрыг, скок, прыг"... куда же без него...

40

Код:
uint16_t i = 0;
_Bool zz = 0;

int main(void)
{
	rcc_setup();
	i2c_setup();
	lcd_init(init_lcd);
	init_dma_i2c_ch2();
	__enable_irq ();
	
	while (1)
	{
    if( dma_req == 0 )
    {
    	if( zz == 0 )
    	{
        if( i <= 512 ) buff[i++] = 255;
        else zz = 1;
    	}
    	else
    	{
        if( i > 0 ) buff[i--] = 0;
        else zz = 0;
    	}
    	ram_to_tic( buff );
    }
	}
}
void DMA1_Channel2_3_IRQHandler (void)
{
	if(DMA1->ISR & DMA_ISR_TCIF2) 
  { 
    DMA1_Channel2->CCR &= ~DMA_CCR_EN;
    DMA1->IFCR |= DMA_IFCR_CTCIF2;
    if( dma_req <= 384 )
    {
    	ram_to_tic( buff + dma_req );
    }
    else
    {
    	dma_req = 0;
    }
  }
}
Код:
#define size_lcd          (512)
#define ADDR_SLAVE        (0x78)
#define lcd_light         (255)
#define lcd_inv         	(0xA7)
#define lcd_norm         	(0xA6)

volatile uint16_t dma_req = 0;

uint8_t buff[ size_lcd ];

uint8_t init_lcd[ 20 ]= { 
	0xA8, 
	0x1F, 
	0xD3, 
	0x00, 
	0x40, 
	0xA1, 
	0xC8, 
	0xDA, 
	0x02, 
	0x81, 
	lcd_light, 
	0xA4, 
	lcd_inv, 
	0xD5, 
	0x80, 
	0x8D, 
	0x14,
	0x20,
	0x00,
	0xAF 
};
void lcd_init( uint8_t *pt )
{    
	while(I2C1->CR2 & I2C_CR2_START){} 
	I2C1->CR2 = 40<<16 | ADDR_SLAVE | I2C_CR2_AUTOEND;  
	I2C1->CR2 |= I2C_CR2_START;
	for(uint8_t i = 0; i < 20; i++)
	{
    while(!(I2C1->ISR & I2C_ISR_TXIS)){}
    I2C1->TXDR = 0x80;
    while(!(I2C1->ISR & I2C_ISR_TXIS)){}
    I2C1->TXDR = *pt++;
	}
}
void init_dma_i2c_ch2( void )
{
	I2C1->CR1 |= I2C_CR1_TXDMAEN;
	RCC->AHBENR |=RCC_AHBENR_DMA1EN;
	DMA1_Channel2->CPAR = (uint32_t)&I2C1->TXDR ; 
	DMA1_Channel2->CCR |= DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL | DMA_CCR_TCIE;
	NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
}
void ram_to_tic( uint8_t* from_where )
{
	DMA1_Channel2->CNDTR = 128;
	DMA1_Channel2->CMAR = (uint32_t)from_where;
	while(I2C1->CR2 & I2C_CR2_START){} 
	I2C1->CR2 = 129<<16 | ADDR_SLAVE | I2C_CR2_AUTOEND ;  
	I2C1->CR2 |= I2C_CR2_START;
	while(!(I2C1->ISR & I2C_ISR_TXIS)){}
	I2C1->TXDR = 0x40;
	dma_req += 128; 
	DMA1_Channel2->CCR |= DMA_CCR_EN;
}

плавное заполнение и обратный засвет.

Отредактировано RA (2019-06-18 20:23:35)

41

С TM1638 вроде все нормально, работает без заморочек. Частота правда только до мегабита.


Вы здесь » Микроконтроллеры » STM32 » I2C