@@ -30,48 +30,19 @@ void set_address(uint32_t addr) {
3030 uint32_t addrh = (addr >> 8 ) & 0xFF ;
3131 uint32_t addru = (addr >> 16 ) & 0xFF ;
3232
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 );
4736
4837 gpio_put (ROE , false); // enable address output
4938}
5039
5140/**
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+ */
7546uint8_t read_byte (uint32_t addr ) {
7647 // set pins 0-7 to input
7748 gpio_set_dir_in_masked (0x000000FF );
@@ -91,24 +62,52 @@ uint8_t read_byte(uint32_t addr) {
9162}
9263
9364/**
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+ */
9670void write_byte (uint32_t addr , uint8_t val ) {
9771 // set pins 0-7 to output
9872 gpio_set_dir_out_masked (0x000000FF );
9973
74+ // set address on pins
10075 set_address (addr );
10176
77+ gpio_put_masked (0xFF , val );
10278 gpio_put (CE , false);
10379 gpio_put (PGM , false);
10480
105- // sleep_us(DELAY_TIME);
106- gpio_put_masked (0xFF , val );
10781 sleep_us (DELAY_WRITE );
10882
10983 gpio_put (PGM , true);
11084 gpio_put (CE , true);
11185
11286 // set pins 0-7 to input
11387 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);
114113}
0 commit comments