📄 f_11_16_spimemtst.c
字号:
#include "config.h"#include "serial.c"#include "serio.c"#include "delay.h"#define MEMCS 7#define MEM_WREN 6#define MEM_WRITE 2#define MEM_READ 3#define MEM_RDSR 5//prototypesvoid spi_memwren(void);unsigned char spi_memrdsr(void);void spi_memrw(char *buf, unsigned int addr, char write_flag);// do write enablevoid spi_memwren(void){ bitclr(PORTB,MEMCS); // Assert CS SSPBUF = MEM_WREN; while(!SSPIF); // wait until transmited SSPIF = 0; // reset bitset(PORTB,MEMCS); // Negate CS}// read status registerunsigned char spi_memrdsr(void){ bitclr(PORTB,MEMCS); // Assert CS SSPBUF = MEM_RDSR; while(!SSPIF); // wait until transmited SSPIF = 0; // reset SSPBUF = 0; // dummy data for read while(!SSPIF); // wait until transmited SSPIF = 0; // reset bitset(PORTB,MEMCS); // Negate CS return(SSPBUF); // return status}//write or read a blockvoid spi_memrw(char *buf, unsigned int addr, char write_flag){ unsigned char addr_lo, addr_hi, status; char i; // ensure last write is finished do { status = spi_memrdsr(); }while (status & 0x01); //test bit 0 if (write_flag) spi_memwren(); // write enable addr_lo = addr & 0x00FF; addr_hi = (addr >> 8); bitclr(PORTB,MEMCS); // Assert CS if (write_flag) SSPBUF = MEM_WRITE; else SSPBUF = MEM_READ; while(!SSPIF); // wait until transmited SSPIF = 0; // reset SSPBUF = addr_hi; // send high byte address while(!SSPIF); // wait until transmited SSPIF = 0; // reset SSPBUF = addr_lo; // send low byte address while(!SSPIF); // wait until transmited SSPIF = 0; // reset for (i=0;i<32;i++){ // send 32 bytes SSPBUF= *buf; //for read, don't care about this data while(!SSPIF); // wait until transmited SSPIF = 0; // reset if (!write_flag) *buf = SSPBUF; buf++; } bitset(PORTB,MEMCS); // Negate CS} char membuf[32];int memaddr;void main(void){ unsigned char mode,i; // set RB7 for output TRISB = 0x7F; bitset(PORTB,MEMCS); serial_init(95,1); // 19200 in HSPLL mode, crystal = 7.3728 MHz // configure SPI port for serial eeprom CKE = 1; // data transmitted rising edge of SCK CKP = 0; // clk idle is low SMP = 1; // sample data at end of period bitclr(TRISC,3); //SCK, output bitclr(TRISC,5); // SDO, output bitset(TRISC,4); // SDI pin is input // SPI Master Mode FOSC/16 SSPM3 = 0; SSPM2 = 0; SSPM1 = 0; SSPM0 = 1; SSPEN = 0; SSPEN = 1; SSPIF = 0; // clear SPIF bit pcrlf(); printf("Mem Test Started"); pcrlf(); memaddr = 0; printf ("Enter 'w' for write mode, anything else reads: "); mode = getche(); pcrlf(); while(1) { if (mode == 'w') { printf("Enter 32 chars.");pcrlf(); for(i = 0;i< 32;i++) { membuf[i] = getche(); } pcrlf();printf("Doing Write");pcrlf(); spi_memrw(membuf,memaddr,1); // do write memaddr = memaddr +32; } else { spi_memrw(membuf,memaddr,0); // do read for(i = 0;i< 32;i++) putch(membuf[i]); pcrlf(); printf("Any key continues read...");pcrlf(); getch(); memaddr = memaddr +32; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -