⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_11_16_spimemtst.c

📁 PIC_Hi-Tech_C_Mike_Pearces_I2C_routines Microchi PIC_Hi-Tech C_I2C_for_EEPROM_24LC01B Code
💻 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 + -