summaryrefslogtreecommitdiffstats
path: root/boot/max7219.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/max7219.c')
-rw-r--r--boot/max7219.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/boot/max7219.c b/boot/max7219.c
new file mode 100644
index 0000000..3e06562
--- /dev/null
+++ b/boot/max7219.c
@@ -0,0 +1,124 @@
+#include "project.h"
+
+#define NCS (GPIO7)
+#define NCS_PORT GPIOG
+
+#define SCK (GPIO3)
+#define SCK_PORT GPIOB
+
+#define MOSI (GPIO5)
+#define MOSI_PORT GPIOB
+
+
+static void
+set (int sck, int ncs, int mosi)
+{
+ if (sck)
+ SET (SCK);
+ else
+ CLEAR (SCK);
+
+
+ if (ncs)
+ SET (NCS);
+ else
+ CLEAR (NCS);
+
+
+ if (mosi)
+ SET (MOSI);
+ else
+ CLEAR (MOSI);
+
+ // delay_us(1);
+ //delay_us(10);
+
+}
+
+static void
+spip_send_8 (uint8_t wot)
+{
+ int i;
+
+ for (i = 0; i < 8; ++i) {
+ set (0, 0, wot & 0x80);
+ set (1, 0, wot & 0x80);
+ set (0, 0, wot & 0x80);
+ wot <<= 1;
+ }
+}
+
+
+
+static void
+write_reg (uint8_t reg, uint8_t data)
+{
+
+ set (0, 1, 0);
+ set (0, 0, 0);
+
+ spip_send_8 (reg);
+ spip_send_8 (data);
+
+ spip_send_8 (reg);
+ spip_send_8 (data);
+
+ spip_send_8 (reg);
+ spip_send_8 (data);
+
+ set (0, 0, 0);
+ set (0, 1, 0);
+}
+
+
+static void
+write_regs (uint8_t reg, uint8_t data1, uint8_t data2, uint8_t data3)
+{
+
+ set (0, 1, 0);
+ set (0, 0, 0);
+
+ spip_send_8 (reg);
+ spip_send_8 (data3);
+
+ spip_send_8 (reg);
+ spip_send_8 (data2);
+
+ spip_send_8 (reg);
+ spip_send_8 (data1);
+
+ set (0, 0, 0);
+ set (0, 1, 0);
+}
+
+
+void
+max7219_init (void)
+{
+ MAP_OUTPUT_PP (SCK);
+ MAP_OUTPUT_PP (NCS);
+ MAP_OUTPUT_PP (MOSI);
+
+ set (0, 1, 0);
+
+
+ write_reg (0xc, 0x1); //Power up
+ write_reg (0xf, 0x0); //normal mode
+
+ write_reg (0x9, 0x0); //No decode
+ write_reg (0xb, 0x7); //8 digits
+ write_regs (0xa,15,15,15); //max brightness
+ write_reg (1,0);
+ write_reg (2,0);
+ write_reg (3,0);
+ write_reg (4,0);
+ write_reg (5,0);
+ write_regs (6,0xbe,0,0);
+ write_regs (7,0x47,0,0);
+ write_regs (8,0x3d,0,0);
+
+}
+
+
+
+