MAX7221
- Войдите на сайт для отправки комментариев
Пт, 25/07/2014 - 14:01
Друзья!
Пробую использовать микросхему 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 никак.
ну потому что 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 }спасибо. попробую.
но я пологал что запуск теста должен работать в любом состоянии остальных регистров или это не так?
правильно вставил?
void setup() { init_max(); } void loop() { maxSingle(B00000001, B00000011); delay(100); }