Actualmente estoy intentando que funcione una matriz de 8x8 LED, que está controlada por un MAX7219 IC. El chip es compatible con SPI con DIN
, CS
y CLK
pines. Intenté controlar el chip a través del software SPI con un STM32F103
. Este es mi código:
#include "stm32f10x_gpio.h"
#define CS 4
#define SCK 5
#define MOSI 7
void delay(long cycles){
while(cycles > 0)
cycles--;
}
void initSPI(){
RCC->APB2ENR |= (1<<2); //Enable Port A clock
GPIOA->CRL |= (0x3<<(4*CS)); //General PP & 50MHz speed for PA4 (CS)
GPIOA->CRL |= (0x3<<(4*SCK)); //General PP & 50MHz speed for PA5 (SCK)
GPIOA->CRL |= (0x3<<(4*MOSI)); //General PP & 50MHz speed for PA7 (MOSI)
}
void transmitData(uint16_t reg, uint16_t data){
uint16_t serialData = (reg << 8) | (data & 0x00FF); //Last Bit First
GPIOA->ODR &=~(1<<SCK); //Turn SCK low
GPIOA->ODR &=~(1<<MOSI); //Turn MOSI low
GPIOA->ODR &=~(1<<CS); //Turn CS low
delay(10);
for(int i = 0; i < 16; i++){
if((serialData >> (15-i)) & 0x0001){ //Bit is '1'
GPIOA->ODR |= (1<<MOSI); //Turn MOSI high
} else{
GPIOA->ODR &=~(1<<MOSI); //Turn MOSI low
}
delay(10);
GPIOA->ODR |= (1<<SCK); //Turn SCK high
delay(10);
GPIOA->ODR &=~(1<<MOSI); //Turn MOSI Low
if(i == 15){
GPIOA->ODR |= (1<<CS); //Turn CS high
}
GPIOA->ODR &=~(1<<SCK); //Turn SCK low
}
delay(10);
GPIOA->ODR |= (1<<SCK); //Turn SCK high
GPIOA->ODR &=~(1<<CS); //Turn CS low
delay(10);
GPIOA->ODR |= (1<<CS); //Turn CS high
delay(50);
}
void initMAX7219(){
transmitData(0x0B,0x07); //Scan Limit
delay(50000);
transmitData(0x09,0x00); //Decode Mode
delay(50000);
transmitData(0x0C,0x01); //Shutdown Mode
delay(50000);
transmitData(0x0F,0x00); //Display Test
delay(50000);
transmitData(0x01,0x01); //Display '1'
delay(50000);
}
int main(void)
{
initSPI();
initMAX7219();
while(1){
;
}
}
Y así es como se ven los estados de los pines, capturados con un analizador lógico:
Aunquecreoquehicetodocorrectamente(elestadodebitsdelDIN
pinsetransfiereenelflancoascendentedeCLK
,los16bitscompletossedesplazanenelbordeascendentedeCS
,quedeberíaaparecerapartirdel16bordeascendentedeCLK
)nofunciona.Eltiempomáslargoes100nsquedebecumplirse.Cualquierayudaesmuyapreciada.
Editar:AsíescomoseveelPCB: