嗨,对话工程师,
我用了一块基于da14580的Murata型ZF板,板上有一个2M位的spiflash(W25X20CL),现在我把程序代码flash到SPI并从中引导。现在,一切正常。
但是,我必须保存一些数据,如远程设备地址和一些其他信息到SPI,这样,我可以做定向连接到以前的设备复位后。我在app\u bond\u db.c和app\u bond\u db.h上读了一些代码。
我这样调用了一些api:
1、 在periph_init()中配置SPI gpio,
GPIO\ U配置引脚(SPI\ U GPIO\ U端口、SPI\ U CLK\ U引脚、INPUT\ U PULLUP、PID\ U SPI\ U CLK、false);
GPIO\u ConfigurePin(SPI\u GPIO\u PORT,SPI\u CS\u PIN,INPUT\u PULLDOWN,PID\u SPI\u EN,false);
GPIO\ U配置引脚(SPI\ U GPIO\ U端口、SPI\ U DO\ U引脚、输出、PID\ U SPI\ U DO、false);
GPIO\ U配置引脚(SPI\ U GPIO\ U端口、SPI\ U DI\ U引脚、INPUT\ U下拉、PID\ U SPI\ U DI、false);
2、 在函数system\u init()中的periph\u init()之后调用bond\u db\u init()
无效债券\u db \u init(void)
{
//从外部内存资源加载绑定数据
bond_db_load_flash();
//简单检查内存中的垃圾(这也会捕获清除内存的0xFF)
if((bdb.next\u slot>APP\u BOND\u DB\u MAX\u BOND\u PEERS)||
(bdb.start\u hdr!=BOND_DB_HEADER_START)| |(bdb.end_hdr!=键合(DB(头端)
{
bond_db_clear();
}
}
3.在需要保存数据的地方,调用函数bond\u db\u store\u at\u idx()
void bond \u db \u store \u at \u idx(结构bond \u db \u data*数据,int idx)
{
//更新缓存
memcpy(&bdb.data[idx],data,sizeof(struct bond_db_data));
bond_db_store_flash();
}
但是,我从来没有成功地编写SPI,下面是一些调试信息
1、 spi\u flash\u enable总是返回spi\u flash\u AUTO\u DETECT\u NOT\u DETECTED in function bond\u db\u spi\u flash\u init。我的spi falsh是W25X20,它由spi\u flash dirver支持
2、 bond\u db\u erase\u flash\u扇区在函数bond\u db\u store\u flash中返回ERR\u TIMEOUT,因此无法将数据写入flash。
3、 spi\u flash\u wait\u till\u ready always return ERR\u TIMEOUT(等待\u就绪总是返回错误超时)
我是Da14580的新手,有人能给我一些建议吗,或者DA有一个外部SPI闪存编程的分步指南吗
提前谢谢!
嗨,克里斯0409,
似乎580和flash之间存在通信问题,可能是由于某种原因,flash没有响应,这就是为什么在运行spi\u flash\u enable()函数时,spi\u flash\u auto\u detect()会运行,以查看flash是否是SDK支持的任何已知flash,因此,当启用flash时,请检查flash返回的jedec\u id是多少。关于超时,我假设您从spi\u flash\u wait\u till\u ready()函数得到,SDK会提示flash检查它是否准备好接受命令,此提示用于MAX\u READY\u WAIT\u COUNT如果在580的提示下,flash的状态从未从BUSY状态出来,那么设备将返回ERR\u超时。
检查你的SPI\u EN pin,我看到你已经把它配置为输入,但这应该是一个输出,因为580应该控制SPI的CS,并且还将它设置为true,因为false将在任何时候都启用flash,而不是在交互期间。
谢谢你的对话