小模块例程:spi_w25qxx - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

spi读写w25qxx

  • mb_zynq_periph_test
  • 利用的是小梅哥的程序。程序的实现非常简单。
  • 程序可以兼容mb/zynq。移植到mb上时,把src下的主要文件都拷贝过去,然后根据错误提示注释掉存在报错的地方,就可以运行了。结果一样。
  • 库函数请参考Code部分的ACZ702_Lib\AXI_SPI
#include "COMMON.h"

typedef struct{
	u8 txbuf[32];
	u8 rxbuf[32];
	u8 length;
}t_buf;

t_buf WriteBuffer[]={
	{{0x90},{0x00},6},
	{{0x4b},{0x00},13},

	{{0x05},{0x00},2},
	{{0x35},{0x00},2},
	{{0x15},{0x00},2},

	{{0x06},{0x00},1},
	{{0x20,0x00,0x00,0x10},{0x00},4}, //sector erase
	{{0x05},{0x00},2},
	{{0x05},{0x00},2},
	{{0xff},{0x00},0}, //length=0 => delay_ms

	{{0x05},{0x00},2},
	{{0x03,0x00,0x00,0x10},{0x00},14},  //page read

	{{0x06},{0x00},1},
	{{0x02,0x00,0x00,0x10,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88},{0x00},12}, //page program
	{{0xff},{0x00},0}, //length=0 => delay_ms

	{{0x03,0x00,0x00,0x10},{0x00},14},  //page read
};



void print_buffer(u8 *pdata, int length)
{
	for(int i=0; i<length; i++){
		xil_printf("pdata[%d]=%x\r\n", i, pdata[i]);
	}
	xil_printf("********************\r\n");
}

int main(void)
{

	//初始化通用中断控制器
	ScuGic_Init();

	//初始化AXI_SPI0,设为主机模式
	AXI_SPI_Init(&AXI_SPI0, XPAR_SPI_0_DEVICE_ID, XSP_MASTER_OPTION);

	//初始化私有定时器中断,定时间隔100ms
	ScuTimer_Int_Init(100000);

	for(int i=0; i<sizeof(WriteBuffer)/sizeof(*WriteBuffer); i++){
		if(WriteBuffer[i].length==0){
			usleep(WriteBuffer[i].txbuf[0]*1000);
			continue;
		}

		AXI_SPI_Transfer(&AXI_SPI0, 0, WriteBuffer[i].rxbuf, WriteBuffer[i].txbuf, WriteBuffer[i].length);
		print_buffer(WriteBuffer[i].rxbuf, WriteBuffer[i].length);
	}


	while(1) {
		//刷新间隔由私有定时器中断控制,中断服务函数在ISR.c中
		if(Refresh_Flag) {
			Refresh_Flag = 0;

			//xil_printf("timer run!\r\n");
		}
	}

	return 0;
}

运行结果

image image