主题中讨论的其他器件:SysConfig、 LAUNCHXL-CC26X2R1
你(们)好
对于 SPI 闪存、我需要知道文件访问的最大数量、例如1)可以打开文件的次数2)最大大小3)并行打开
您能帮我检查一下吗
相关信息
Divya
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
你(们)好
对于 SPI 闪存、我需要知道文件访问的最大数量、例如1)可以打开文件的次数2)最大大小3)并行打开
您能帮我检查一下吗
相关信息
Divya
您好、Divya、
您是指 TI 驱动程序的 SPIFFSNVS 模块 、是否已评估 了 spiffsexternal 示例? 另一个很好的资源是 尖塔夫 吉特卜。 关于您的问题:
此致、
Ryan
你(们)好
我们使用 spiexternal 代码和 nvsexternal 代码测试了 MX25L6433FM2I 该 SPI 闪存、并使用相同的配置数据集检查了读取、写入拓扑。
同样、我们尝试使用具有 相同配置数据集但具有 SPI 外部代码的4mn Winbond 外部 SPI 闪存进行测试、它显示以下提到的错误日志、而对于 NVS 代码、它似乎可以正常工作
请提供有关此方面的帮助
错误日志
"正在安装文件系统...
正在创建 spiffsFile...
创建文件系统时出错"
您好、Divya、
打印日志指示 SPIFFS_OPEN 存在问题、因此您应进一步参考 SimpleLink MCU SDK 用户指南的 FatFS/SPIFFS 部分 和 FatFs 产品网页/SPIFFSGitHub 项目。 您可以尝试添加 \source\third_parti\spiff 文件直接插入您的项目中、以覆盖预构建库并进一步调试问题。 SPIFFSNVS.h TI 驱动程序 API 还会针对逻辑/物理块/页面大小发出警告、这些逻辑/物理块/页面大小应专门与 Winbond 器件匹配(由 spiffsexternal.c 文件进一步配置)。
此致、
Ryan
以 LaunchPad 的 MX25R8035F 为例、 数据表中定义了256字节的 SPIFFS_logical_page_size 和4096字节的 SPIFFS_logical_block_size 和0x1000字节的 NVS sectorSize。 这使逻辑块大小成为逻辑页大小(4096/256 = 16)的整数倍、而 sectorSize (4096/4069 = 1)的整数倍。 这也涵盖 了 MX25R8035F 上可用的1MB 全部闪存数据 、因为 sectorSize*SPIFFS_logical_page_size = 4096*256 = 1、048、576字节。 唯一的限制是 SysConfig 在 NVS 驱动程序中设置的区域大小、默认为0x3000、因为该示例不需要所有可用的外部存储器来完成任务。
此致、
Ryan
是的,即使我们今天深入检查了,它似乎与 MX25R8035F 完全相同。
我们仅建立了正确的连接,而且还使用代码中的 spio 引脚手动将 CS 引脚设置为低电平,在这种情况下,我们也无法找到 CS 变为低电平。
只有不同的行为是仅 CS,其他行为则是相同的
您能帮您解决这个问题吗?
此外,当我们检查文件句柄的返回错误编号,它的-10001,在头文件中,它提到=>文件是完全错误
您也可以确认这一点吗?
好的
与 Winbond 器件不同、我们现在还使用外部 MX25R8035F 1MB SPI 闪存进行了检查
因此、它也无法正常工作
当 我们比较内部 SPI 闪存和外部 SPI 闪存配置时、可以看到以下差异
区域大小在外部增加
在 SPI 闪存配置中、我们可以看到选择了 launchpad SPI
下面是我们的问题
为什么区域大小会增加?
2.为什么使用 Launchpad SPI 且有两个 SPI 配置可用?
此外、我们还通过作为外部接口进行连接尝试了相同的 MX25R8035FZUIL0 SPI 闪存、但仍然无法读取/写入。 是否需要其他硬件要求?
我们还尝试了 NVSexternal 而不是 spiffsexternal、我们可以在其中读取/写入 NVS external 和 spiffsexternal 之间的主要区别是什么?
下面是 default_external_confile.c 文件
/*
* ======== ti_drivers_config.c ========
* Configured TI-Drivers module definitions
*
* DO NOT EDIT - This file is generated for the CC26X2R1_LAUNCHXL
* by the SysConfig tool.
*/
#include <stddef.h>
#include <stdint.h>
#ifndef DeviceFamily_CC26X2
#define DeviceFamily_CC26X2
#endif
#include <ti/devices/DeviceFamily.h>
#include "ti_drivers_config.h"
/*
* ============================= Display =============================
*/
#include <ti/display/Display.h>
#include <ti/display/DisplayUart.h>
#define CONFIG_Display_COUNT 1
#define Display_UARTBUFFERSIZE 1024
static char displayUARTBuffer[Display_UARTBUFFERSIZE];
DisplayUart_Object displayUartObject;
const DisplayUart_HWAttrs displayUartHWAttrs = {
.uartIdx = CONFIG_UART_0,
.baudRate = 115200,
.mutexTimeout = (unsigned int)(-1),
.strBuf = displayUARTBuffer,
.strBufLen = Display_UARTBUFFERSIZE
};
const Display_Config Display_config[CONFIG_Display_COUNT] = {
/* CONFIG_Display_0 */
/* XDS110 UART */
{
.fxnTablePtr = &DisplayUartMin_fxnTable,
.object = &displayUartObject,
.hwAttrs = &displayUartHWAttrs
},
};
const uint_least8_t Display_count = CONFIG_Display_COUNT;
/*
* =============================== DMA ===============================
*/
#include <ti/drivers/dma/UDMACC26XX.h>
#include <ti/devices/cc13x2_cc26x2/driverlib/udma.h>
#include <ti/devices/cc13x2_cc26x2/inc/hw_memmap.h>
UDMACC26XX_Object udmaCC26XXObject;
const UDMACC26XX_HWAttrs udmaCC26XXHWAttrs = {
.baseAddr = UDMA0_BASE,
.powerMngrId = PowerCC26XX_PERIPH_UDMA,
.intNum = INT_DMA_ERR,
.intPriority = (~0)
};
const UDMACC26XX_Config UDMACC26XX_config[1] = {
{
.object = &udmaCC26XXObject,
.hwAttrs = &udmaCC26XXHWAttrs,
},
};
/*
* =============================== GPIO ===============================
*/
#include <ti/drivers/GPIO.h>
#include <ti/drivers/gpio/GPIOCC26XX.h>
#define CONFIG_GPIO_COUNT 1
/*
* ======== gpioPinConfigs ========
* Array of Pin configurations
*/
GPIO_PinConfig gpioPinConfigs[] = {
/* SPI Flash Slave Select GPIO Instance */
GPIOCC26XX_DIO_04 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_MED | GPIO_CFG_OUT_HIGH,
};
/*
* ======== gpioCallbackFunctions ========
* Array of callback function pointers
*
* NOTE: Unused callback entries can be omitted from the callbacks array to
* reduce memory usage by enabling callback table optimization
* (GPIO.optimizeCallbackTableSize = true)
*/
GPIO_CallbackFxn gpioCallbackFunctions[] = {
/* SPI Flash Slave Select GPIO Instance */
NULL,
};
const uint_least8_t CONFIG_GPIO_0_CONST = CONFIG_GPIO_0;
/*
* ======== GPIOCC26XX_config ========
*/
const GPIOCC26XX_Config GPIOCC26XX_config = {
.pinConfigs = (GPIO_PinConfig *)gpioPinConfigs,
.callbacks = (GPIO_CallbackFxn *)gpioCallbackFunctions,
.numberOfPinConfigs = 1,
.numberOfCallbacks = 1,
.intPriority = (~0)
};
/*
* =============================== NVS ===============================
*/
#include <ti/drivers/NVS.h>
#include <ti/drivers/nvs/NVSSPI25X.h>
/*
* NVSSPI25X External NVS flash region definitions
*/
NVSSPI25X_Object nvsSPI25XObjects[1];
static const NVSSPI25X_HWAttrs nvsSPI25XHWAttrs[1] = {
/* CONFIG_NVSEXTERNAL */
{
.regionBaseOffset = 0x0,
.regionSize = 0x1000,
.sectorSize = 0x1000,
.verifyBuf = NULL,
.verifyBufSize = 0,
/* NVS opens SPI */
.spiHandle = NULL,
/* SPI driver index */
.spiIndex = CONFIG_SPI_0,
.spiBitRate = 4000000,
/* GPIO driver pin index */
.spiCsnGpioIndex = CONFIG_GPIO_0,
.statusPollDelayUs = 100
},
};
#define CONFIG_NVS_COUNT 1
const NVS_Config NVS_config[CONFIG_NVS_COUNT] = {
/* CONFIG_NVSEXTERNAL */
{
.fxnTablePtr = &NVSSPI25X_fxnTable,
.object = &nvsSPI25XObjects[0],
.hwAttrs = &nvsSPI25XHWAttrs[0],
},
};
const uint_least8_t CONFIG_NVSEXTERNAL_CONST = CONFIG_NVSEXTERNAL;
const uint_least8_t NVS_count = CONFIG_NVS_COUNT;
/*
* =============================== PIN ===============================
*/
#include <ti/drivers/PIN.h>
#include <ti/drivers/pin/PINCC26XX.h>
#define CONFIG_PIN_COUNT 6
const PIN_Config BoardGpioInitTable[CONFIG_PIN_COUNT + 1] = {
/* Parent Signal: CONFIG_SPI_0 SCLK, (DIO11) */
CONFIG_PIN_3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
/* Parent Signal: CONFIG_SPI_0 MISO, (DIO1) */
CONFIG_PIN_4 | PIN_INPUT_EN | PIN_NOPULL | PIN_IRQ_DIS,
/* Parent Signal: CONFIG_SPI_0 MOSI, (DIO0) */
CONFIG_PIN_5 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
/* XDS110 UART, Parent Signal: CONFIG_UART_0 TX, (DIO3) */
CONFIG_PIN_0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
/* XDS110 UART, Parent Signal: CONFIG_UART_0 RX, (DIO2) */
CONFIG_PIN_1 | PIN_INPUT_EN | PIN_PULLDOWN | PIN_IRQ_DIS,
/* Parent Signal: CONFIG_GPIO_0 GPIO Pin, (DIO4) */
CONFIG_PIN_2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MED,
PIN_TERMINATE
};
const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
.intPriority = (~0),
.swiPriority = 0
};
/*
* =============================== Power ===============================
*/
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26X2.h>
#include "ti_drivers_config.h"
extern void PowerCC26XX_standbyPolicy(void);
extern bool PowerCC26XX_calibrate(unsigned int);
const PowerCC26X2_Config PowerCC26X2_config = {
.enablePolicy = true,
.policyInitFxn = NULL,
.policyFxn = PowerCC26XX_standbyPolicy,
.calibrateFxn = PowerCC26XX_calibrate,
.calibrateRCOSC_LF = true,
.calibrateRCOSC_HF = true,
.enableTCXOFxn = NULL
};
/*
* =============================== SPI DMA ===============================
*/
#include <ti/drivers/SPI.h>
#include <ti/drivers/spi/SPICC26X2DMA.h>
#define CONFIG_SPI_COUNT 1
/*
* ======== spiCC26X2DMAObjects ========
*/
SPICC26X2DMA_Object spiCC26X2DMAObjects[CONFIG_SPI_COUNT];
/*
* ======== spiCC26X2DMAHWAttrs ========
*/
const SPICC26X2DMA_HWAttrs spiCC26X2DMAHWAttrs[CONFIG_SPI_COUNT] = {
/* CONFIG_SPI_0 */
{
.baseAddr = SSI0_BASE,
.intNum = INT_SSI0_COMB,
.intPriority = (~0),
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI0,
.defaultTxBufValue = ~0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
.minDmaTransferSize = 10,
.mosiPin = IOID_0,
.misoPin = IOID_1,
.clkPin = IOID_11,
.csnPin = PIN_UNASSIGNED
},
};
/*
* ======== SPI_config ========
*/
const SPI_Config SPI_config[CONFIG_SPI_COUNT] = {
/* CONFIG_SPI_0 */
{
.fxnTablePtr = &SPICC26X2DMA_fxnTable,
.object = &spiCC26X2DMAObjects[CONFIG_SPI_0],
.hwAttrs = &spiCC26X2DMAHWAttrs[CONFIG_SPI_0]
},
};
const uint_least8_t CONFIG_SPI_0_CONST = CONFIG_SPI_0;
const uint_least8_t SPI_count = CONFIG_SPI_COUNT;
/*
* =============================== UART ===============================
*/
#include <ti/drivers/UART.h>
#include <ti/drivers/uart/UARTCC26XX.h>
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26X2.h>
#include <ti/devices/cc13x2_cc26x2/inc/hw_memmap.h>
#include <ti/devices/cc13x2_cc26x2/inc/hw_ints.h>
#define CONFIG_UART_COUNT 1
UARTCC26XX_Object uartCC26XXObjects[CONFIG_UART_COUNT];
static unsigned char uartCC26XXRingBuffer0[32];
static const UARTCC26XX_HWAttrsV2 uartCC26XXHWAttrs[CONFIG_UART_COUNT] = {
{
.baseAddr = UART1_BASE,
.intNum = INT_UART1_COMB,
.intPriority = (~0),
.swiPriority = 0,
.powerMngrId = PowerCC26X2_PERIPH_UART1,
.ringBufPtr = uartCC26XXRingBuffer0,
.ringBufSize = sizeof(uartCC26XXRingBuffer0),
.rxPin = IOID_2,
.txPin = IOID_3,
.ctsPin = PIN_UNASSIGNED,
.rtsPin = PIN_UNASSIGNED,
.txIntFifoThr = UARTCC26XX_FIFO_THRESHOLD_1_8,
.rxIntFifoThr = UARTCC26XX_FIFO_THRESHOLD_4_8,
.errorFxn = NULL
},
};
const UART_Config UART_config[CONFIG_UART_COUNT] = {
{ /* CONFIG_UART_0 */
.fxnTablePtr = &UARTCC26XX_fxnTable,
.object = &uartCC26XXObjects[CONFIG_UART_0],
.hwAttrs = &uartCC26XXHWAttrs[CONFIG_UART_0]
},
};
const uint_least8_t CONFIG_UART_0_CONST = CONFIG_UART_0;
const uint_least8_t UART_count = CONFIG_UART_COUNT;
#include <stdbool.h>
#include <ti/devices/cc13x2_cc26x2/driverlib/ioc.h>
#include <ti/devices/cc13x2_cc26x2/driverlib/cpu.h>
#include <ti/drivers/pin/PINCC26XX.h>
/*
* ======== Board_sendExtFlashByte ========
*/
void Board_sendExtFlashByte(PIN_Handle pinHandle, uint8_t byte)
{
uint8_t i;
/* SPI Flash CS */
PIN_setOutputValue(pinHandle, IOID_20, 0);
for (i = 0; i < 8; i++) {
PIN_setOutputValue(pinHandle, IOID_10, 0); /* SPI Flash CLK */
/* SPI Flash MOSI */
PIN_setOutputValue(pinHandle, IOID_9, (byte >> (7 - i)) & 0x01);
PIN_setOutputValue(pinHandle, IOID_10, 1); /* SPI Flash CLK */
/*
* Waste a few cycles to keep the CLK high for at
* least 45% of the period.
* 3 cycles per loop: 8 loops @ 48 Mhz = 0.5 us.
*/
CPUdelay(8);
}
PIN_setOutputValue(pinHandle, IOID_10, 0); /* CLK */
PIN_setOutputValue(pinHandle, IOID_20, 1); /* CS */
/*
* Keep CS high at least 40 us
* 3 cycles per loop: 700 loops @ 48 Mhz ~= 44 us
*/
CPUdelay(700);
}
/*
* ======== Board_wakeUpExtFlash ========
*/
void Board_wakeUpExtFlash(void)
{
PIN_Config extFlashPinTable[] = {
/* SPI Flash CS */
IOID_20 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL |
PIN_INPUT_DIS | PIN_DRVSTR_MED,
PIN_TERMINATE
};
PIN_State extFlashPinState;
PIN_Handle extFlashPinHandle = PIN_open(&extFlashPinState, extFlashPinTable);
/*
* To wake up we need to toggle the chip select at
* least 20 ns and ten wait at least 35 us.
*/
/* Toggle chip select for ~20ns to wake ext. flash */
PIN_setOutputValue(extFlashPinHandle, IOID_20, 0);
/* 3 cycles per loop: 1 loop @ 48 Mhz ~= 62 ns */
CPUdelay(1);
PIN_setOutputValue(extFlashPinHandle, IOID_20, 1);
/* 3 cycles per loop: 560 loops @ 48 Mhz ~= 35 us */
CPUdelay(560);
PIN_close(extFlashPinHandle);
}
/*
* ======== Board_shutDownExtFlash ========
*/
void Board_shutDownExtFlash(void)
{
/*
* To be sure we are putting the flash into sleep and not waking it,
* we first have to make a wake up call
*/
Board_wakeUpExtFlash();
PIN_Config extFlashPinTable[] = {
/* SPI Flash CS*/
IOID_20 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL |
PIN_INPUT_DIS | PIN_DRVSTR_MED,
/* SPI Flash CLK */
IOID_10 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL |
PIN_INPUT_DIS | PIN_DRVSTR_MED,
/* SPI Flash MOSI */
IOID_9 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL |
PIN_INPUT_DIS | PIN_DRVSTR_MED,
/* SPI Flash MISO */
IOID_8 | PIN_INPUT_EN | PIN_PULLDOWN,
PIN_TERMINATE
};
PIN_State extFlashPinState;
PIN_Handle extFlashPinHandle = PIN_open(&extFlashPinState, extFlashPinTable);
uint8_t extFlashShutdown = 0xB9;
Board_sendExtFlashByte(extFlashPinHandle, extFlashShutdown);
PIN_close(extFlashPinHandle);
}
#include <ti/drivers/Board.h>
/*
* ======== Board_initHook ========
* Perform any board-specific initialization needed at startup. This
* function is declared weak to allow applications to override it if needed.
*/
void __attribute__((weak)) Board_initHook(void)
{
}
/*
* ======== Board_init ========
* Perform any initialization needed before using any board APIs
*/
void Board_init(void)
{
/* ==== /ti/drivers/Power initialization ==== */
Power_init();
/* ==== /ti/devices/CCFGTemplate initialization ==== */
/* ==== /ti/drivers/PIN initialization ==== */
if (PIN_init(BoardGpioInitTable) != PIN_SUCCESS) {
/* Error with PIN_init */
while (1);
}
Board_shutDownExtFlash();
Board_initHook();
}
/*
* ======== ti_drivers_config.c ========
* Configured TI-Drivers module definitions
*
* DO NOT EDIT - This file is generated for the CC26X2R1_LAUNCHXL
* by the SysConfig tool.
*/
#include <stddef.h>
#include <stdint.h>
#ifndef DeviceFamily_CC26X2
#define DeviceFamily_CC26X2
#endif
#include <ti/devices/DeviceFamily.h>
#include "ti_drivers_config.h"
/*
* ============================= Display =============================
*/
#include <ti/display/Display.h>
#include <ti/display/DisplayUart.h>
#define CONFIG_Display_COUNT 1
#define Display_UARTBUFFERSIZE 1024
static char displayUARTBuffer[Display_UARTBUFFERSIZE];
DisplayUart_Object displayUartObject;
const DisplayUart_HWAttrs displayUartHWAttrs = {
.uartIdx = CONFIG_UART_0,
.baudRate = 115200,
.mutexTimeout = (unsigned int)(-1),
.strBuf = displayUARTBuffer,
.strBufLen = Display_UARTBUFFERSIZE
};
const Display_Config Display_config[CONFIG_Display_COUNT] = {
/* CONFIG_Display_0 */
/* XDS110 UART */
{
.fxnTablePtr = &DisplayUartMin_fxnTable,
.object = &displayUartObject,
.hwAttrs = &displayUartHWAttrs
},
};
const uint_least8_t Display_count = CONFIG_Display_COUNT;
/*
* =============================== DMA ===============================
*/
#include <ti/drivers/dma/UDMACC26XX.h>
#include <ti/devices/cc13x2_cc26x2/driverlib/udma.h>
#include <ti/devices/cc13x2_cc26x2/inc/hw_memmap.h>
UDMACC26XX_Object udmaCC26XXObject;
const UDMACC26XX_HWAttrs udmaCC26XXHWAttrs = {
.baseAddr = UDMA0_BASE,
.powerMngrId = PowerCC26XX_PERIPH_UDMA,
.intNum = INT_DMA_ERR,
.intPriority = (~0)
};
const UDMACC26XX_Config UDMACC26XX_config[1] = {
{
.object = &udmaCC26XXObject,
.hwAttrs = &udmaCC26XXHWAttrs,
},
};
/*
* =============================== GPIO ===============================
*/
#include <ti/drivers/GPIO.h>
#include <ti/drivers/gpio/GPIOCC26XX.h>
#define CONFIG_GPIO_COUNT 1
/*
* ======== gpioPinConfigs ========
* Array of Pin configurations
*/
GPIO_PinConfig gpioPinConfigs[] = {
/* SPI Flash Slave Select GPIO Instance */
GPIOCC26XX_DIO_20 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_MED | GPIO_CFG_OUT_HIGH,
};
/*
* ======== gpioCallbackFunctions ========
* Array of callback function pointers
*
* NOTE: Unused callback entries can be omitted from the callbacks array to
* reduce memory usage by enabling callback table optimization
* (GPIO.optimizeCallbackTableSize = true)
*/
GPIO_CallbackFxn gpioCallbackFunctions[] = {
/* SPI Flash Slave Select GPIO Instance */
NULL,
};
const uint_least8_t CONFIG_GPIO_0_CONST = CONFIG_GPIO_0;
/*
* ======== GPIOCC26XX_config ========
*/
const GPIOCC26XX_Config GPIOCC26XX_config = {
.pinConfigs = (GPIO_PinConfig *)gpioPinConfigs,
.callbacks = (GPIO_CallbackFxn *)gpioCallbackFunctions,
.numberOfPinConfigs = 1,
.numberOfCallbacks = 1,
.intPriority = (~0)
};
/*
* =============================== NVS ===============================
*/
#include <ti/drivers/NVS.h>
#include <ti/drivers/nvs/NVSSPI25X.h>
/*
* NVSSPI25X External NVS flash region definitions
*/
NVSSPI25X_Object nvsSPI25XObjects[1];
static const NVSSPI25X_HWAttrs nvsSPI25XHWAttrs[1] = {
/* CONFIG_NVSEXTERNAL */
{
.regionBaseOffset = 0x0,
.regionSize = 0x100000,
.sectorSize = 0x1000,
.verifyBuf = NULL,
.verifyBufSize = 0,
/* NVS opens SPI */
.spiHandle = NULL,
/* SPI driver index */
.spiIndex = CONFIG_SPI_1,
.spiBitRate = 4000000,
/* GPIO driver pin index */
.spiCsnGpioIndex = CONFIG_GPIO_0,
.statusPollDelayUs = 100
},
};
#define CONFIG_NVS_COUNT 1
const NVS_Config NVS_config[CONFIG_NVS_COUNT] = {
/* CONFIG_NVSEXTERNAL */
{
.fxnTablePtr = &NVSSPI25X_fxnTable,
.object = &nvsSPI25XObjects[0],
.hwAttrs = &nvsSPI25XHWAttrs[0],
},
};
const uint_least8_t CONFIG_NVSEXTERNAL_CONST = CONFIG_NVSEXTERNAL;
const uint_least8_t NVS_count = CONFIG_NVS_COUNT;
/*
* =============================== PIN ===============================
*/
#include <ti/drivers/PIN.h>
#include <ti/drivers/pin/PINCC26XX.h>
#define CONFIG_PIN_COUNT 9
const PIN_Config BoardGpioInitTable[CONFIG_PIN_COUNT + 1] = {
/* Parent Signal: CONFIG_SPI_0 SCLK, (DIO5) */
CONFIG_PIN_3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
/* Parent Signal: CONFIG_SPI_0 MISO, (DIO27) */
CONFIG_PIN_4 | PIN_INPUT_EN | PIN_NOPULL | PIN_IRQ_DIS,
/* Parent Signal: CONFIG_SPI_0 MOSI, (DIO4) */
CONFIG_PIN_5 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
/* XDS110 UART, Parent Signal: CONFIG_UART_0 TX, (DIO3) */
CONFIG_PIN_0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
/* XDS110 UART, Parent Signal: CONFIG_UART_0 RX, (DIO2) */
CONFIG_PIN_1 | PIN_INPUT_EN | PIN_PULLDOWN | PIN_IRQ_DIS,
/* MX25R8035F SPI Flash Slave Select, Parent Signal: CONFIG_GPIO_0 GPIO Pin, (DIO20) */
CONFIG_PIN_2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MED,
/* LaunchPad SPI Bus, Parent Signal: CONFIG_SPI_1 SCLK, (DIO10) */
CONFIG_PIN_6 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
/* LaunchPad SPI Bus, Parent Signal: CONFIG_SPI_1 MISO, (DIO8) */
CONFIG_PIN_7 | PIN_INPUT_EN | PIN_NOPULL | PIN_IRQ_DIS,
/* LaunchPad SPI Bus, Parent Signal: CONFIG_SPI_1 MOSI, (DIO9) */
CONFIG_PIN_8 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
PIN_TERMINATE
};
const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
.intPriority = (~0),
.swiPriority = 0
};
/*
* =============================== Power ===============================
*/
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26X2.h>
#include "ti_drivers_config.h"
extern void PowerCC26XX_standbyPolicy(void);
extern bool PowerCC26XX_calibrate(unsigned int);
const PowerCC26X2_Config PowerCC26X2_config = {
.enablePolicy = true,
.policyInitFxn = NULL,
.policyFxn = PowerCC26XX_standbyPolicy,
.calibrateFxn = PowerCC26XX_calibrate,
.calibrateRCOSC_LF = true,
.calibrateRCOSC_HF = true,
.enableTCXOFxn = NULL
};
/*
* =============================== SPI DMA ===============================
*/
#include <ti/drivers/SPI.h>
#include <ti/drivers/spi/SPICC26X2DMA.h>
#define CONFIG_SPI_COUNT 2
/*
* ======== spiCC26X2DMAObjects ========
*/
SPICC26X2DMA_Object spiCC26X2DMAObjects[CONFIG_SPI_COUNT];
/*
* ======== spiCC26X2DMAHWAttrs ========
*/
const SPICC26X2DMA_HWAttrs spiCC26X2DMAHWAttrs[CONFIG_SPI_COUNT] = {
/* CONFIG_SPI_0 */
{
.baseAddr = SSI0_BASE,
.intNum = INT_SSI0_COMB,
.intPriority = (~0),
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI0,
.defaultTxBufValue = ~0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
.minDmaTransferSize = 10,
.mosiPin = IOID_4,
.misoPin = IOID_27,
.clkPin = IOID_5,
.csnPin = PIN_UNASSIGNED
},
/* CONFIG_SPI_1 */
/* LaunchPad SPI Bus */
{
.baseAddr = SSI1_BASE,
.intNum = INT_SSI1_COMB,
.intPriority = (~0),
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI1,
.defaultTxBufValue = ~0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI1_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI1_TX,
.minDmaTransferSize = 10,
.mosiPin = IOID_9,
.misoPin = IOID_8,
.clkPin = IOID_10,
.csnPin = PIN_UNASSIGNED
},
};
/*
* ======== SPI_config ========
*/
const SPI_Config SPI_config[CONFIG_SPI_COUNT] = {
/* CONFIG_SPI_0 */
{
.fxnTablePtr = &SPICC26X2DMA_fxnTable,
.object = &spiCC26X2DMAObjects[CONFIG_SPI_0],
.hwAttrs = &spiCC26X2DMAHWAttrs[CONFIG_SPI_0]
},
/* CONFIG_SPI_1 */
/* LaunchPad SPI Bus */
{
.fxnTablePtr = &SPICC26X2DMA_fxnTable,
.object = &spiCC26X2DMAObjects[CONFIG_SPI_1],
.hwAttrs = &spiCC26X2DMAHWAttrs[CONFIG_SPI_1]
},
};
const uint_least8_t CONFIG_SPI_0_CONST = CONFIG_SPI_0;
const uint_least8_t CONFIG_SPI_1_CONST = CONFIG_SPI_1;
const uint_least8_t SPI_count = CONFIG_SPI_COUNT;
/*
* =============================== UART ===============================
*/
#include <ti/drivers/UART.h>
#include <ti/drivers/uart/UARTCC26XX.h>
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26X2.h>
#include <ti/devices/cc13x2_cc26x2/inc/hw_memmap.h>
#include <ti/devices/cc13x2_cc26x2/inc/hw_ints.h>
#define CONFIG_UART_COUNT 1
UARTCC26XX_Object uartCC26XXObjects[CONFIG_UART_COUNT];
static unsigned char uartCC26XXRingBuffer0[32];
static const UARTCC26XX_HWAttrsV2 uartCC26XXHWAttrs[CONFIG_UART_COUNT] = {
{
.baseAddr = UART1_BASE,
.intNum = INT_UART1_COMB,
.intPriority = (~0),
.swiPriority = 0,
.powerMngrId = PowerCC26X2_PERIPH_UART1,
.ringBufPtr = uartCC26XXRingBuffer0,
.ringBufSize = sizeof(uartCC26XXRingBuffer0),
.rxPin = IOID_2,
.txPin = IOID_3,
.ctsPin = PIN_UNASSIGNED,
.rtsPin = PIN_UNASSIGNED,
.txIntFifoThr = UARTCC26XX_FIFO_THRESHOLD_1_8,
.rxIntFifoThr = UARTCC26XX_FIFO_THRESHOLD_4_8,
.errorFxn = NULL
},
};
const UART_Config UART_config[CONFIG_UART_COUNT] = {
{ /* CONFIG_UART_0 */
.fxnTablePtr = &UARTCC26XX_fxnTable,
.object = &uartCC26XXObjects[CONFIG_UART_0],
.hwAttrs = &uartCC26XXHWAttrs[CONFIG_UART_0]
},
};
const uint_least8_t CONFIG_UART_0_CONST = CONFIG_UART_0;
const uint_least8_t UART_count = CONFIG_UART_COUNT;
#include <stdbool.h>
#include <ti/devices/cc13x2_cc26x2/driverlib/ioc.h>
#include <ti/devices/cc13x2_cc26x2/driverlib/cpu.h>
#include <ti/drivers/pin/PINCC26XX.h>
/*
* ======== Board_sendExtFlashByte ========
*/
void Board_sendExtFlashByte(PIN_Handle pinHandle, uint8_t byte)
{
uint8_t i;
/* SPI Flash CS */
PIN_setOutputValue(pinHandle, IOID_20, 0);
for (i = 0; i < 8; i++) {
PIN_setOutputValue(pinHandle, IOID_10, 0); /* SPI Flash CLK */
/* SPI Flash MOSI */
PIN_setOutputValue(pinHandle, IOID_9, (byte >> (7 - i)) & 0x01);
PIN_setOutputValue(pinHandle, IOID_10, 1); /* SPI Flash CLK */
/*
* Waste a few cycles to keep the CLK high for at
* least 45% of the period.
* 3 cycles per loop: 8 loops @ 48 Mhz = 0.5 us.
*/
CPUdelay(8);
}
PIN_setOutputValue(pinHandle, IOID_10, 0); /* CLK */
PIN_setOutputValue(pinHandle, IOID_20, 1); /* CS */
/*
* Keep CS high at least 40 us
* 3 cycles per loop: 700 loops @ 48 Mhz ~= 44 us
*/
CPUdelay(700);
}
/*
* ======== Board_wakeUpExtFlash ========
*/
void Board_wakeUpExtFlash(void)
{
PIN_Config extFlashPinTable[] = {
/* SPI Flash CS */
IOID_20 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL |
PIN_INPUT_DIS | PIN_DRVSTR_MED,
PIN_TERMINATE
};
PIN_State extFlashPinState;
PIN_Handle extFlashPinHandle = PIN_open(&extFlashPinState, extFlashPinTable);
/*
* To wake up we need to toggle the chip select at
* least 20 ns and ten wait at least 35 us.
*/
/* Toggle chip select for ~20ns to wake ext. flash */
PIN_setOutputValue(extFlashPinHandle, IOID_20, 0);
/* 3 cycles per loop: 1 loop @ 48 Mhz ~= 62 ns */
CPUdelay(1);
PIN_setOutputValue(extFlashPinHandle, IOID_20, 1);
/* 3 cycles per loop: 560 loops @ 48 Mhz ~= 35 us */
CPUdelay(560);
PIN_close(extFlashPinHandle);
}
/*
* ======== Board_shutDownExtFlash ========
*/
void Board_shutDownExtFlash(void)
{
/*
* To be sure we are putting the flash into sleep and not waking it,
* we first have to make a wake up call
*/
Board_wakeUpExtFlash();
PIN_Config extFlashPinTable[] = {
/* SPI Flash CS*/
IOID_20 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL |
PIN_INPUT_DIS | PIN_DRVSTR_MED,
/* SPI Flash CLK */
IOID_10 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL |
PIN_INPUT_DIS | PIN_DRVSTR_MED,
/* SPI Flash MOSI */
IOID_9 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL |
PIN_INPUT_DIS | PIN_DRVSTR_MED,
/* SPI Flash MISO */
IOID_8 | PIN_INPUT_EN | PIN_PULLDOWN,
PIN_TERMINATE
};
PIN_State extFlashPinState;
PIN_Handle extFlashPinHandle = PIN_open(&extFlashPinState, extFlashPinTable);
uint8_t extFlashShutdown = 0xB9;
Board_sendExtFlashByte(extFlashPinHandle, extFlashShutdown);
PIN_close(extFlashPinHandle);
}
#include <ti/drivers/Board.h>
/*
* ======== Board_initHook ========
* Perform any board-specific initialization needed at startup. This
* function is declared weak to allow applications to override it if needed.
*/
void __attribute__((weak)) Board_initHook(void)
{
}
/*
* ======== Board_init ========
* Perform any initialization needed before using any board APIs
*/
void Board_init(void)
{
/* ==== /ti/drivers/Power initialization ==== */
Power_init();
/* ==== /ti/devices/CCFGTemplate initialization ==== */
/* ==== /ti/drivers/PIN initialization ==== */
if (PIN_init(BoardGpioInitTable) != PIN_SUCCESS) {
/* Error with PIN_init */
while (1);
}
Board_shutDownExtFlash();
Board_initHook();
}
另请查看下图

外部区域大小占用所有1MB 的 MX25R8035F SPI 闪存、CC2642R 内部不可用(共352KB)
2.内部 NVS 配置不使用 SPI 配置,外部选项可以从器件上可用的两个 SPI 外设中选择一个。 默认外部示例使用可用的 LaunchPad SPI 配置来连接板载外部闪存器件。
3.您使用的连接是否与 LAUNCHXL-CC26X2R1 设计文件相同? 对默认示例的 SysConfig 文件应用了哪些更改?
FFS 使用非易失性存储(NVS)驱动程序作为接口来实现闪存文件系统。 任一默认示例的 NVS 实现似乎是相同的。
请确保参考每个示例的自述文件、以了解有关其预期操作的更多信息。 您参考的是哪个 SimpleLink SDK 版本? 如果您能够使用 LAUNCHXL-CC26X2R1观察到问题、请分享可用于重新创建行为的步骤。
此致、
Ryan
你(们)好
只需确认一下 、MX25R8035F 和 MX25L6433F 的 nvsexternal 和 spiffsexternal 工作、以及 W25Q32JV 的 nvsexternal 工作吗? 因此、W25Q32JV 上只有外部尖峰发生故障? 请尝试将 Winbond 设备 ID 和大小添加到 source/ti/common/extflash/ExtFlash.c 文件中的 flashInfo 表中。 在该注释中、您是否有任何可以测试的 W25X40CL/W25X20CL 器件? 此时、您是否仍然注意到 CS 引脚不规则? 请提供您正在使用的 SDK 版本。
此致、
Ryan
你(们)好
是的、只有在尖顶时、它才会失败。 我们还看到了您所说的 extflash.c 文件、我们如何编译该 bcz、我们找不到任何方法来执行该操作。
www.ti.com/.../SIMPLELINK-CC13X2-26X2-SDK
我们仅使用此 SDK
我错了,extflash.c 不参与非 OAD 项目,其中包括 spiffsexternal 项目。 SPIFFS 驱动程序应该已经检测到内存中不存在现有文件系统并返回 SPIFFS_ERR_NOT_A_FS、从而导致 spiffsexternal.c 使用 SPIFFS_format 格式化新文件系统。 您可以尝试调用 SPIFFS_UNmount、后跟 SPIFFS_format 和 SPIFFS_mount、以查看这是否会导致对现有行为进行任何更改。
此致、
Ryan
您能否确认您 已测试多 个 W25Q32JV 器件? 请 将所有源文件(即所有.c 和.h 文件)从 source\third_party\spiffs 直接复制到您的项目工作区(spiffsexternal.c 所在的位置)、以绕过预构建的 spiffs 库。 然后、您可以在 CCS 中单步调试 SPIFFS_mount 函数、以进一步确定失败的确切原因。 我还建议您在 CCS 工程属性中禁用 Arm 编译器优化。 我还在 SDK 用户指南中找到了更多 SPIFFS 信息。
此致、
Ryan
您好、Divya、
很高兴您能找到错误的原因、很遗憾我没有第三方 SPIFFS 材料的相关经验。 spiffs_phys_rd 的结果似乎 不符合预期。 您可以将 W25Q32JV 的此函数结果 与内部 SPIFFS 和外部 MX25选项进行比较。 您可以从 spiffs_cache.c 调试 spiffs_phys_rd、以进一步确定可能出现的问题。
此致、
Ryan