103 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // spiram.h
 | |
| //
 | |
| // Header for a Little Library for accessing SPI RAM chips such as 23K256-I/P
 | |
| // using bcm2835 library on Raspberry Pi
 | |
| //
 | |
| // Author: Mike McCauley
 | |
| // Copyright (C) 2018 Mike McCauley
 | |
| // This software is part of the bcm2835 library and is licensed under the same conditions
 | |
| // $Id:  $
 | |
| 
 | |
| #include <stdbool.h> // bool, true, false
 | |
| 
 | |
| #ifndef SPIRAM_h
 | |
| #define SPIRAM_h
 | |
| 
 | |
| #define SPIRAM_HOLD_DISABLE     0x1
 | |
| #define SPIRAM_MODE_BYTE       (0x00 | SPIRAM_HOLD_DISABLE)
 | |
| #define SPIRAM_MODE_PAGE       (0x80 | SPIRAM_HOLD_DISABLE)
 | |
| #define SPIRAM_MODE_STREAM     (0x40 | SPIRAM_HOLD_DISABLE)
 | |
| #define SPIRAM_MODE_INVALID    0xff
 | |
| #define SPIRAM_OPCODE_READ_SR  0x05
 | |
| #define SPIRAM_OPCODE_WRITE_SR 0x01
 | |
| #define SPIRAM_OPCODE_READ     0x03
 | |
| #define SPIRAM_OPCODE_WRITE    0x02
 | |
| 
 | |
| /* Size of a page in 23K256 */
 | |
| #define SPIRAM_PAGE_SIZE       32
 | |
| 
 | |
| /*
 | |
|  * This library allows you to read and write data from an external SPI interfaced static ram (SRAM)
 | |
|  * such as 23K256 (256kbit = 32kByte)
 | |
|  * Byte and POage modes are supported.
 | |
|  * Valid addresses are from 0x0000 to 0x7fff
 | |
|  * Tested on RPI 3 Model B, Raspbian Jessie
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * Initialise the spiram library, enables SPI with default divider of 
 | |
|  * BCM2835_SPI_CLOCK_DIVIDER_65536 = 6.1035156kHz on RPI3.
 | |
|  * You can change the SPI speed after calling this by calling bcm2835_spi_setClockDivider()
 | |
|  * Returns true on success, false otherwise
 | |
|  */
 | |
| bool spiram_begin();
 | |
| 
 | |
| /*
 | |
|  * Stops using the RPI SPI functions and returns the GPIO pins to their default behaviour.
 | |
|  * Call this when you have finished using SPI forever, or at the end of your program
 | |
|  * Returns true on success, false otherwise
 | |
|  */
 | |
| bool spiram_end();
 | |
| 
 | |
| /*
 | |
|  * Read and returns the current value of the SRAM status register
 | |
|  */
 | |
| uint8_t spiram_read_sr();
 | |
| 
 | |
| /*
 | |
|  * Write a new value to the SRAM status register, 
 | |
|  * usually one of SPIRAM_MODE_*
 | |
|  * You should never need to call this directly. Used internally.
 | |
|  * Returns true on success, false otherwise
 | |
|  */
 | |
| bool spiram_write_sr(uint8_t value);
 | |
| 
 | |
| /*
 | |
|  * Set the operating mode of the SRAM.
 | |
|  * Mode is one of  SPIRAM_MODE_*. THis is done automatically 
 | |
|  * by the spiram_write_* and spiram_read_* functions, so you would not normally
 | |
|  * need to call this directly.
 | |
|  * Returns true on success, false otherwise
 | |
|  */
 | |
| bool spiram_set_mode(uint8_t mode);
 | |
| 
 | |
| /*
 | |
|  * Reads a single byte from the given address and returns it.
 | |
|  */
 | |
| uint8_t spiram_read_byte(uint16_t address);
 | |
| 
 | |
| /*
 | |
|  * Writes a single byte to the given address.
 | |
|  * Returns true on success, false otherwise
 | |
|  */
 | |
| bool spiram_write_byte(uint16_t address, uint8_t value);
 | |
| 
 | |
| /*
 | |
|  * Reads a whole page of data (32 bytes) from the page starting at the given address.
 | |
|  * The read data is placed in buf. Be sure that there is enough rom there for it.
 | |
|  * Caution: if the starting address is not on a page boundary, 
 | |
|  * it will wrap back to the beginning of the page.
 | |
|  * Returns true on success, false otherwise
 | |
|  */
 | |
| bool spiram_read_page(uint16_t address, uint8_t *buf);
 | |
| 
 | |
| /*
 | |
|  * Writes a whole page of data (32 bytes) to the page starting at the given address.
 | |
|  * Caution: if the starting address is not on a page boundary, 
 | |
|  * it will wrap back to the beginning of the page.
 | |
|  * Returns true on success, false otherwise
 | |
|  */
 | |
| bool spiram_write_page(uint16_t address, uint8_t *buf);
 | |
| 
 | |
| #endif
 |