settings中启用了elm fatfs组件后,网络dhcp 和 ping正常,但是fatfs不能写入文件,echo "hello" 1.txt
提示open failed
,请教下什么原因导致的,谢谢。
spi驱动初始化代码如下:
文件 - board.c
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hspi->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspInit 0 */
/* USER CODE END SPI1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */
}
if(hspi->Instance==SPI2)
{
/* USER CODE BEGIN SPI2_MspInit 0 */
/* USER CODE END SPI2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI2_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
W25Q64驱动核心代码 - 文件app-spi.c
static int rt_hw_spi_flash_init(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
rt_hw_spi_device_attach("spi2", "spi20", GPIOB, GPIO_PIN_12);// spi10 表示挂载在 spi3 总线上的 0 号设备,PC0是片选,这一步就可以将从设备挂在到总线中。
if (RT_NULL == rt_sfud_flash_probe("W25Q64", "spi20")) //注册块设备,这一步可以将外部flash抽象为系统的块设备
{
return -RT_ERROR;
};
return RT_EOK;
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
static int mnt_init(void)
{
mkfs("elm","W25Q64");//挂在前需格式化
if(dfs_mount("W25Q64","/","elm",0,0)==0) //挂载文件系统,参数:块设备名称、挂载目录、文件系统类型、读写标志、私有数据0
{
rt_kprintf("dfs mount success\r\n");
}
else
{
rt_kprintf("dfs mount failed\r\n");
}
}
INIT_ENV_EXPORT(mnt_init);
ENC28J60核心代码 - 文件dev_enc28j60.c
#define ENC28J60_INT GET_PIN(C, 5)
static int rt_hw_enc28j60_init(void)
{
rt_hw_spi_device_attach("spi1", "spi10", GPIOC, GPIO_PIN_4);//PC4 ENC28J60片选CS
enc28j60_attach("spi10");
rt_pin_mode(ENC28J60_INT, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(ENC28J60_INT, PIN_IRQ_MODE_FALLING, (void(*)(void*))enc28j60_isr, RT_NULL);
rt_pin_irq_enable(ENC28J60_INT, PIN_IRQ_ENABLE);
}
INIT_COMPONENT_EXPORT(rt_hw_enc28j60_init);
你好,
LWIP单独使用正常。
W25Q64 配置成功后,echo mkdir rm都能正常使用,但重启后数据就没了,求助大佬。
@悟_空 上面你说 echo 的时候 open failed ,就是搞错情况了呗。
上面open failed 是lwip+fatfs同时使用报的错;
那现在的问题还是使用两个SPI的时候,文件系统报open failed的问题了(分别单独使用无问题)。
关闭lwip和相关初始化就能使用,是不是同时使用两个SPI的时候有啥需要注意的呢。
@悟_空 没有需要注意的,不同口各不影响。理论上是这样。
但是代码中有bug就不好说了,其中一个影响另一个的内存,或者因为代码量多了,程序中其它地方有bug现在暴露出来问题了,也不一定必然是 lwip 或俩 spi 引起的。
还是上面的建议,对比一下前后spi寄存器的值有没有异常变化,比如控制寄存器的值变了
我基本判断是rtthread的bug了,但我调试能力有限,能反馈给官方社区吗。
@悟_空 看我最近的那篇文章,在线调试查看内存的,也可以查看任意的外设寄存器,先确定spi配置没变化,才能说是不是有bug