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
							 |