w801 用 sdkv1. 00. 10 移植 flashdb 后出现 spi 读取失败的情况
现象: 801 在上电初始化 spi 后读取寄存器能正常读出数据 01, 但在运行一段时间后由接口 tls_spi_read_with_cmd 响应的数据变为 00, 查看逻辑分析仪后确认 slave 响应的数据为正常 01:
然后在驱动中增加日志:
实际打印:
发现 word32 的值由 0xffffff01 变为 0xffffff00, 但 spi 相关寄存器值未发生变化
导致该问题的可能原因是什么? 应该如何解决
测试代码:
#define SPI_TT ({\
if (! spi_testttt () ) {\
printf ("spi errrr: %s: %d! ", __FUNCTION__, __LINE__) ; \
while (1) ; \
}\
}) ;
int master_spi_send_data (int clk, int type)
{
int *p;
int i;
/*MASTER SPI configuratioin*/
wm_spi_ck_config (WM_IO_PB_24) ;
wm_spi_di_config (WM_IO_PB_25) ;
wm_spi_do_config (WM_IO_PB_26) ;
tls_gpio_cfg (WM_IO_PB_18, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH) ;
tls_gpio_write (WM_IO_PB_18, 1) ; //cs
tls_gpio_cfg (WM_IO_PB_17, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH) ;
tls_gpio_write (WM_IO_PB_17, 1) ; //nrst
printf ("\r\n") ;
printf ("cs--PB04, ck--PB02, di--PB03, do--PB05; \r\n") ;
if (clk " 0)
{
clk = 1000000; /* default 1M */
}
if (-1 == type)
{
type = 0;
}
if (0 == type)
{
tls_spi_trans_type (0) ;
}
else
{
tls_spi_trans_type (2) ;
}
tls_spi_setup (TLS_SPI_MODE_0, TLS_SPI_CS_LOW, clk) ;
vTaskDelay (1) ;
tls_gpio_write (WM_IO_PB_18, 0) ;
uint8_t data = 0;
data = 5;
tls_spi_write ( (u8 *) &data, 1) ;
data = 1;
tls_spi_write ( (u8 *) &data, 1) ;
tls_gpio_write (WM_IO_PB_18, 1) ;
vTaskDelay (1) ;
data = 4;
tls_gpio_write (WM_IO_PB_18, 0) ;
tls_spi_write ( (u8 *) &data, 1) ;
if (tls_spi_read (&data, 1) ! = TLS_SPI_STATUS_OK) {
printf ("spi err\n") ;
}
tls_gpio_write (WM_IO_PB_18, 1) ;
printf ("spi read: 0x%x\n", data) ;
return WM_SUCCESS;
}
uint8_t spi_testttt (void) {
uint8_t data = 0, addr = 0x04;
tls_gpio_write (WM_IO_PB_18, 0) ;
tls_spi_read_with_cmd (&addr, 1, &data, 1) ;
tls_gpio_write (WM_IO_PB_18, 1) ;
return ! ! data;
}
测试在板子上进行, 无飞线
重新开个 sdk 测试了下, 发现与 flashdb 无关, 与 flash 读取有关, 以下测试代码能稳定复现:
日志截图:
逻辑分析仪截图:
@ggggjh 这两个并没有关系, 我找了一个 spi 外接 flash 的板子, 按照这个代码简单修改了, 测试并没有出错.
@abcd 你修改后 di 的引脚是哪一个? 我找了块没有外设的 801 开发板测试, 将 di 初始化为不同 io 并短到 3. 3, 当我初始化 di 为 PB0, PB16, PB25 时会出现读值由 0xff 变为 0x00 的情况, 但是初始化为 PB03 时确实读出都是 0xff 正常值没有 0 的情况.
@ggggjh 用了 PB25 也没错, 试下把 wm_main. c 里 wm_gpio_config 里 spi pin 初始化注掉.
@abcd 屏蔽了测试确实没问题了