小模块例程: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;
}
运行结果