93 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								// spiram.c
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Little library for accessing  SPI RAM 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 <bcm2835.h>
							 | 
						||
| 
								 | 
							
								#include <string.h> // memcpy
							 | 
						||
| 
								 | 
							
								#include "spiram.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static uint8_t _mode = SPIRAM_MODE_INVALID;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t spiram_read_sr()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  uint8_t command[] = { SPIRAM_OPCODE_READ_SR, 0};
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_transfern(command, sizeof(command));
							 | 
						||
| 
								 | 
							
								  return command[1];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool spiram_write_sr(uint8_t value)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  uint8_t command[] = { SPIRAM_OPCODE_WRITE_SR, value};
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_transfern(command, sizeof(command));
							 | 
						||
| 
								 | 
							
								  return true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool spiram_set_mode(uint8_t mode)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if (mode != _mode)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      spiram_write_sr(mode);
							 | 
						||
| 
								 | 
							
								      _mode = mode;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  return true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool spiram_begin()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  _mode = SPIRAM_MODE_BYTE;
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default
							 | 
						||
| 
								 | 
							
								  return true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool spiram_end()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_end();
							 | 
						||
| 
								 | 
							
								  return true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t spiram_read_byte(uint16_t address)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  spiram_set_mode(SPIRAM_MODE_BYTE);
							 | 
						||
| 
								 | 
							
								  uint8_t command[] = { SPIRAM_OPCODE_READ, (address >> 8) & 0xff, address & 0xff, 0xff };
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_transfern(command, sizeof(command));
							 | 
						||
| 
								 | 
							
								  uint8_t ret = command[3];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool spiram_write_byte(uint16_t address, uint8_t value)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  spiram_set_mode(SPIRAM_MODE_BYTE);
							 | 
						||
| 
								 | 
							
								  uint8_t command[] = { SPIRAM_OPCODE_WRITE, (address >> 8) & 0xff, address & 0xff, value };
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_writenb(command, sizeof(command));
							 | 
						||
| 
								 | 
							
								  return true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool spiram_read_page(uint16_t address, uint8_t *buf)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  spiram_set_mode(SPIRAM_MODE_PAGE);
							 | 
						||
| 
								 | 
							
								  uint8_t command[3 + SPIRAM_PAGE_SIZE] = { SPIRAM_OPCODE_READ, (address >> 8) & 0xff, address & 0xff };
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_transfern(command, sizeof(command));
							 | 
						||
| 
								 | 
							
								  memcpy(buf, command + 3, SPIRAM_PAGE_SIZE);
							 | 
						||
| 
								 | 
							
								  return true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool spiram_write_page(uint16_t address, uint8_t *buf)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  spiram_set_mode(SPIRAM_MODE_PAGE);
							 | 
						||
| 
								 | 
							
								  uint8_t command[3 + SPIRAM_PAGE_SIZE] = { SPIRAM_OPCODE_WRITE, (address >> 8) & 0xff, address & 0xff };
							 | 
						||
| 
								 | 
							
								  memcpy(command + 3, buf, SPIRAM_PAGE_SIZE);;
							 | 
						||
| 
								 | 
							
								  bcm2835_spi_writenb(command, sizeof(command));
							 | 
						||
| 
								 | 
							
								  return true;
							 | 
						||
| 
								 | 
							
								}
							 |