Проблемы с каскадом на MAX7219 + STM32F103C8

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
agronom961
Родился
Сообщения: 13
Зарегистрирован: Пт фев 07, 2014 23:53:17

Проблемы с каскадом на MAX7219 + STM32F103C8

Сообщение agronom961 »

Добрый день уважаемые! Прошу помощи в запуске каскада. Одна микросхема работает нормально, при подключении второй информация на индикаторах дублируется или две цифры накладываются друг на друга (одна ярче вторая тусклее).
инициализация SPI
Спойлер

Код: Выделить всё

 
    SPI_InitTypeDef SPIConf;
    SPIConf.SPI_Direction = SPI_Direction_1Line_Tx;
    SPIConf.SPI_Mode = SPI_Mode_Master;
    SPIConf.SPI_DataSize = SPI_DataSize_16b;
    SPIConf.SPI_CPOL = SPI_CPOL_Low;
    SPIConf.SPI_CPHA = SPI_CPHA_1Edge;
    SPIConf.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;
    SPIConf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    SPIConf.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI1, &SPIConf);
    SPI_Cmd(SPI1, ENABLE);
инициализация GPIO
Спойлер

Код: Выделить всё

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE);
    GPIO_InitTypeDef PORT;
    PORT.GPIO_Pin   = SCK_Pin | MOSI_Pin;
    PORT.GPIO_Speed = GPIO_Speed_2MHz;
    PORT.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &PORT);
    PORT.GPIO_Pin   = SS_Pin;
    PORT.GPIO_Speed = GPIO_Speed_2MHz;
    PORT.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &PORT);
инициализация MAX7219
Спойлер

Код: Выделить всё

    SPISend(OP_DISPLAYTEST,0);
    SPISend(OP_SHUTDOWN,1);
    SPISend(OP_SCANLIMIT, SCANLIMIT);
    SPISend(OP_DECODEMODE,DECODEMODE);
    SPISend(OP_INTENSITY, 1);
отправка данных
Спойлер

Код: Выделить всё

     for(;;){  
     GPIO_ResetBits(GPIOA, SS_Pin);
      while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
      SPISend(OP_DIGIT7, 8);
      SPISend(OP_NOOP, 0x0000 );        
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
      GPIO_SetBits(GPIOA, SS_Pin);

      GPIO_ResetBits(GPIOA, SS_Pin); 
      while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); 
      SPISend(OP_DIGIT7, 1);
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
      GPIO_SetBits(GPIOA, SS_Pin);}
Добавлено after 1 hour 7 minutes 15 seconds:
соединены так
Изображение
Реклама
imsushka
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн окт 01, 2018 09:19:51

Re: Проблемы с каскадом на MAX7219 + STM32F103C8

Сообщение imsushka »

Прерывание

Код: Выделить всё

void SPI2_IRQHandler( void ) {
  if ( SPI2->SR & SPI_SR_RXNE ) {
    SPI_RBuffer[SPI_RPos++] = SPI2->DR;
      if ( ++SPI_RPos == SPI_RCount )
        SPI_RPos = 0;

    if ( SPI_SCount ) {
      if ( ( SPI_SCount & 0x7 ) == 0 ) {
        GPIOB->ODR |=  GPIO_ODR_ODR12;
        GPIOB->ODR &= ~GPIO_ODR_ODR12;
      }
      SPI2->DR = SPI_SBuffer[SPI_SPos++];
      SPI_SCount--;
    } else {
      GPIOB->ODR |=  GPIO_ODR_ODR12;
      SPI2->CR2  &= ~SPI_CR2_RXNEIE;
    }
  }
}
формирование посылки

Код: Выделить всё

uint32_t temp;

  while ( SPI_SCount ) {}
  SPI2->CR2  &= ~SPI_CR2_RXNEIE;
  GPIOB->ODR &= ~GPIO_ODR_ODR12;
  for ( temp = 0; temp < 8; temp++ ) {
    SPI_SBuffer[temp * 8 + 0] = temp + 1;
    SPI_SBuffer[temp * 8 + 1] = DATA[ temp + 24 ];
    SPI_SBuffer[temp * 8 + 2] = temp + 1;
    SPI_SBuffer[temp * 8 + 3] = DATA[ temp + 16 ];
    SPI_SBuffer[temp * 8 + 4] = temp + 1;
    SPI_SBuffer[temp * 8 + 5] = DATA[ temp + 8 ];
    SPI_SBuffer[temp * 8 + 6] = temp + 1;
    SPI_SBuffer[temp * 8 + 7] = DATA[ temp + 0 ];
  }
  SPI_SPos    = 1;
  SPI_SCount  = 63;
  SPI2->DR    = SPI_SBuffer[0];
  SPI2->CR2  |= SPI_CR2_RXNEIE;
GPIO_ODR_ODR12 - строб

4 последовательно включенных макса
Реклама
agronom961
Родился
Сообщения: 13
Зарегистрирован: Пт фев 07, 2014 23:53:17

Re: Проблемы с каскадом на MAX7219 + STM32F103C8

Сообщение agronom961 »

imsushka, Спасибо.
Ответить

Вернуться в «ARM»