Library to drive the Microchip 23K256 SRAM over SPI.
main.cpp
- Committer:
- romilly
- Date:
- 2010-08-15
- Revision:
- 1:28eb43851e6e
- Parent:
- 0:318f4f480b1b
File content as of revision 1:28eb43851e6e:
#include "mbed.h"
DigitalOut ncs(p14);
SPI spi(p5,p6,p7);
// 23K256 data sheet at http://ww1.microchip.com/downloads/en/DeviceDoc/22100B.pdf
// Page-mode commands have not been implemented; I have found no need for them yet.
// Assumes spi mode is default (8,0).
// The 23K256 supports the mbed's maximum spi frequency of 12MHz.
// mode codes for 23K256
#define BYTE_MODE 0x00
#define SEQUENTIAL_MODE 0x40
// command codes for 23K256
#define READ 0x03
#define WRITE 0x02
#define READ_STATUS 0x05 // called RDSR in datasheet
#define WRITE_STATUS 0x01 // called WRSR in datasheet
inline void on() {
ncs = 0;
}
inline void off() {
ncs = 1;
}
void writeStatus(char status) {
on();
spi.write(WRITE_STATUS);
spi.write(status);
off();
}
int readStatus() {
on();
spi.write(READ_STATUS);
int result = spi.write(0);
off();
return result;
}
inline void prepareCommand(char command, int address) {
on();
spi.write(command);
spi.write(address >> 8);
spi.write(address & 0xFF);
}
// write or read a single byte
void write(int address, char byte) {
prepareCommand(WRITE, address);
spi.write(byte);
off();
}
char read(int address) {
prepareCommand(READ, address);
int result = spi.write(0);
off();
return (char) result;
}
// buffered write and read
/*
* the single-byte read and write assume the 23K256 is in its default byte-mode
* so sequential-model commands must switch the chip into sequential mode
* at the start and return it to byte mode at the end.
*/
void write(int address, char * buffer, int count) {
writeStatus(SEQUENTIAL_MODE);
prepareCommand(WRITE, address);
for (int i = 0; i < count; i++) {
spi.write(buffer[i]);
}
off();
writeStatus(BYTE_MODE);
}
void read(int address, char * buffer, int count) {
writeStatus(SEQUENTIAL_MODE);
prepareCommand(READ, address);
for (int i = 0; i < count; i++) {
buffer[i] = spi.write(0);
}
off();
writeStatus(BYTE_MODE);
}
int main() {
off();
printf("Status codes: 0 = byte mode (default), 0x40 = sequential mode. ");
printf("Status is currently %i\r\n", readStatus());
char buff[50];
write(0, 'h');
write(1, 'i');
write(2, '!');
write(3, '\0');
for (int address = 0; address < 4; address++) {
buff[address] = read(address);
}
printf("mem = %s\r\n", buff);
write(0, "Hello world!",12);
read(0, buff, 12);
buff[12]='\0';
printf("now = %s\r\n", buff);
}
Microchip 23K256 SRAM