MAX7221

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Друзья!

Пробую использовать микросхему MAX7221 - драйвер индикатора.

Пробовал отправлять данные по SPI и просто shiftout.  Не работает.

Вот пример отправки данных (проба запустить тест микросхемы, где данные расположены так

D15-D8(адрес) - В7-D0(код-1 вкл тест):    00001111 00000001 )

 digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, B00000001); //  7 <- 0
 shiftOut(dataPin, clockPin, MSBFIRST, B00001111); // 15 <- 8
 digitalWrite(latchPin, HIGH);  

Если кто то имел дело в этой микросхемой будьте добры подскажите какие могут быть глюки.

Перепробовал несколько микросхем - не работает, иногда при запуске контроллера помигает и зависает.

Программа работает - проверял на других микросхемах типа 74HC595 - данные выдаются нормально с помощью моего кода, а MAX7221 никак.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

ну потому что MAX7221 это драйвер индикатора,  и там кроме регистра много чего еще вот смотрите: https://www.sparkfun.com/datasheets/Components/General/COM-09622-MAX7219-MAX7221.pdf

я таким кодом работал с ними:

#include <SPI.h>
#define CS_PIN 53
     
int maxInUse = 6;    //change this variable to set how many MAX7219's you'll use
     
// define max7219 registers
#define max7219_reg_noop        0x00
#define max7219_reg_digit0      0x01
#define max7219_reg_digit1      0x02
#define max7219_reg_digit2      0x03
#define max7219_reg_digit3      0x04
#define max7219_reg_digit4      0x05
#define max7219_reg_digit5      0x06
#define max7219_reg_digit6      0x07
#define max7219_reg_digit7      0x08
#define max7219_reg_decodeMode  0x09
#define max7219_reg_intensity   0x0a
#define max7219_reg_scanLimit   0x0b
#define max7219_reg_shutdown    0x0c
#define max7219_reg_displayTest 0x0f
     
void maxSingle( byte reg, byte col) {    
    //maxSingle is the "easy"  function to use for a     //single max7219
     
      digitalWrite(CS_PIN, LOW);       // begin    
      SPI.transfer(reg);             // specify register
      SPI.transfer(col);             //((data & 0x01) * 256) + data >> 1); // put data  
      digitalWrite(CS_PIN, LOW);       // and CS_PIN da shit
      digitalWrite(CS_PIN,HIGH);
    }
     
void maxAll (byte reg, byte col) {    // initialize  all  MAX7219's in the system
      int c = 0;
      digitalWrite(CS_PIN, LOW);  // begin    
      for ( c =1; c<= maxInUse; c++) {
      SPI.transfer(reg);  // specify register
      SPI.transfer(col);//((data & 0x01) * 256) + data >> 1); // put data
        }
      digitalWrite(CS_PIN, LOW);
      digitalWrite(CS_PIN,HIGH);
    }
     
void maxOne(byte maxNr, byte reg, byte col) {    
    //maxOne is for adressing different MAX7219's,
    //whilele having a couple of them cascaded
     
      int c = 0;
      digitalWrite(CS_PIN, LOW);  // begin    
     
      for ( c = maxInUse; c > maxNr; c--) {
        SPI.transfer(0);    // means no operation
        SPI.transfer(0);    // means no operation
      }
     
      SPI.transfer(reg);  // specify register
      SPI.transfer(col);//((data & 0x01) * 256) + data >> 1); // put data
     
      for ( c =maxNr-1; c >= 1; c--) {
        SPI.transfer(0);    // means no operation
        SPI.transfer(0);    // means no operation
      }
     
      digitalWrite(CS_PIN, LOW); // and CS_PIN da shit
      digitalWrite(CS_PIN,HIGH);
    }

void init_max(){
      byte i;
     //initiation of the max 7219
      maxAll(max7219_reg_scanLimit, 0x07);      
      maxAll(max7219_reg_decodeMode, 0x00);  // using an led matrix (not digits)
      maxAll(max7219_reg_shutdown, 0x01);    // not in shutdown mode
      maxAll(max7219_reg_displayTest, 0x00); // no display test
       for (i=1; i<=8; i++) {                // empty registers, turn all LEDs off
        maxAll(i,0);
      }
      maxAll(max7219_reg_intensity, 0x0f & 0x0f);    // the first 0x0f is the value you can set
                                                      // range: 0x00 to 0x0f 
}

 

Rednaxela
Offline
Зарегистрирован: 26.08.2013

спасибо. попробую.

но я пологал что запуск теста должен работать в любом состоянии остальных регистров или это не так? 

Rednaxela
Offline
Зарегистрирован: 26.08.2013

правильно вставил?

void setup() {
 init_max();
}
  
void loop() {
 maxSingle(B00000001, B00000011);
 delay(100);
}