@@ -30,48 +30,19 @@ void set_address(uint32_t addr) {
30
30
uint32_t addrh = (addr >> 8 ) & 0xFF ;
31
31
uint32_t addru = (addr >> 16 ) & 0xFF ;
32
32
33
- gpio_put_masked (0xFF00 , addrl << 8 );
34
- gpio_put (ALS , true);
35
- sleep_us (DELAY_ADDR );
36
- gpio_put (ALS , false);
37
-
38
- gpio_put_masked (0xFF00 , addrh << 8 );
39
- gpio_put (AHS , true);
40
- sleep_us (DELAY_ADDR );
41
- gpio_put (AHS , false);
42
-
43
- gpio_put_masked (0x0700 , addru << 8 );
44
- gpio_put (AUS , true);
45
- sleep_us (DELAY_ADDR );
46
- gpio_put (AUS , false);
33
+ set_address_upper (addru );
34
+ set_address_high (addrh );
35
+ set_address_low (addrl );
47
36
48
37
gpio_put (ROE , false); // enable address output
49
38
}
50
39
51
40
/**
52
- * Set upper bits in address register
53
- **/
54
- void set_address_high (uint32_t addr ) {
55
- set_address (addr & 0xFFFFFF00 );
56
- }
57
-
58
- /**
59
- * Set lower 8 bits in address register
60
- **/
61
- void set_address_low (uint32_t addr ) {
62
- uint32_t addrl = addr & 0xFF ;
63
-
64
- gpio_put_masked (0xFF00 , addrl << 8 );
65
- gpio_put (ALS , true);
66
- sleep_us (DELAY_ADDR );
67
- gpio_put (ALS , false);
68
-
69
- gpio_put (ROE , false); // enable address output
70
- }
71
-
72
- /**
73
- * Read single byte from address
74
- **/
41
+ * @brief Read a single byte from address
42
+ *
43
+ * @param addr full 19-bit address
44
+ * @return uint8_t value at address
45
+ */
75
46
uint8_t read_byte (uint32_t addr ) {
76
47
// set pins 0-7 to input
77
48
gpio_set_dir_in_masked (0x000000FF );
@@ -91,24 +62,52 @@ uint8_t read_byte(uint32_t addr) {
91
62
}
92
63
93
64
/**
94
- * Write byte at address
95
- **/
65
+ * @brief Write a byte at address
66
+ *
67
+ * @param addr full 19-bit address
68
+ * @param val 8-bit value to write
69
+ */
96
70
void write_byte (uint32_t addr , uint8_t val ) {
97
71
// set pins 0-7 to output
98
72
gpio_set_dir_out_masked (0x000000FF );
99
73
74
+ // set address on pins
100
75
set_address (addr );
101
76
77
+ gpio_put_masked (0xFF , val );
102
78
gpio_put (CE , false);
103
79
gpio_put (PGM , false);
104
80
105
- // sleep_us(DELAY_TIME);
106
- gpio_put_masked (0xFF , val );
107
81
sleep_us (DELAY_WRITE );
108
82
109
83
gpio_put (PGM , true);
110
84
gpio_put (CE , true);
111
85
112
86
// set pins 0-7 to input
113
87
gpio_set_dir_in_masked (0x000000FF );
88
+ }
89
+
90
+ /**
91
+ * @brief Write byte at address while ignoring any upper bytes
92
+ *
93
+ * @param addr 16-bit combination of lower and higher address bits
94
+ * @param val 8-bit value to write
95
+ *
96
+ * Assumes that:
97
+ * - Pins are already set for output
98
+ * - Chip is already active (CE)
99
+ **/
100
+ void write_byte_ignore_upper_fast (uint16_t addr , uint8_t val ) {
101
+ // set address on pins
102
+ uint32_t addrl = addr & 0xFF ;
103
+ uint32_t addrh = (addr >> 8 ) & 0xFF ;
104
+
105
+ set_address_high (addrh );
106
+ set_address_low (addrl );
107
+ gpio_put_masked (0xFF , val );
108
+
109
+ // toggle write
110
+ gpio_put (PGM , false);
111
+ sleep_us (DELAY_WRITE );
112
+ gpio_put (PGM , true);
114
113
}
0 commit comments