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.

[参考译文] CC2650:SPI - SD 卡调用

Guru**** 2562120 points
Other Parts Discussed in Thread: CC2650EM-7ID-RD

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/585814/cc2650-spi---sd-card-call

器件型号:CC2650

您好!

请为我提供任何有关如何  通过 SPI 在 CC2650EM-7ID-RD 和 SD 卡之间构建 SPI 通信的帮助吗? 我使用相应的库、并且根据以下行更改 Board.c 文件:  

/*包含驱动程序*/
#include "SDSPICC2650.h"
#include 
/* SPI 对象*/
SDSPICC2650_Object sdspiCC2650_Object[CC2650_SPICOUNT];

/* SDSPI 配置结构,描述要使用的引脚*/
const SDSPICC2650_HWAttrs sdspiCC2650HWAttrs[CC2650_SPICOUNT]={

baseAddr=SSI0_BASE、//或 I 声明 SSI3_
powerMngrId = Periph_SSI0、
.pinSCK=Board_SPI0_CLK、
.pinMISO=Board_SPI0_MISO、
.pinMOSI=Board_SPI0_MOSI、
.pinCS=Board_SPI0_CSn
}
};


PIN_Handle ledPinHandle;//对于 SD 卡
PIN_STATE newPinState;

PIN_Config ledPinTable[]={
BOARD_SPI0_CSn| PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
BOARD_SPI0_MISO | PIN_INPUT_EN | PIN_PUL拉、
BOARD_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLUDOWN、
BOARD_SPI0_CLK | PIN_INPUT_EN | PIN_PUL拉、
PIN_TERMINATE
}; 
​您是否看到有问题? 我看到了以下帖子
[1]
[2]
192.237.145.96/.../2046762

[3] 192.237.145.96/.../560104

我可以理解、我遵循相同的逻辑、但 SPI 没有响应、而且、当我调用打开 SPI 并尝试读取/写入的函数时、BLE 停止广播。 我创建一个函数 SDcommunication(),其中 I init SDSPI_init (),我开始写入和读取一个 char buffer[30](例如)。 我在 main()或"SimpleBLEPeripheral_taskFxn()"内调用"SD communication()",但没有任何反应。 只有 BLE 停止广播。 SPI 无响应。 您能帮我处理任何 quideline 吗? 一切似乎都是合乎逻辑的、但 SPI 没有响应。

空 SDcommunication (空)     

   SDSPI_Handle sdspiHandle;
   SDSPI_Params sdspiParams;
   SDSPI_init();
   SDSPI_Params_init (sdspiParams);
   sdspiHandle = SDSPI_open (Board_SDSPI0、drive_NUM、&sdspiParams);
   f_write()…
   SDSPI_Close (sdspiHandle);

提前感谢您的参与、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    C26xx 不应使用 SDSPI API、因为它不适用于 CC26xx。 您应该只使用 SPI_Transfer 并将其设为 SD 卡协议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christin、

    感谢您的回复。 请举一个小例子。  

    此外、您能否告诉我我可以使用哪种比特率? 手册中提到的频率超过2MHz。 您是否曾尝试过此操作? 我期待收到你的回复。

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最大 SPI 速度为4m Hz。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我们没有 SDSPI 示例、但您只需使用 SPI 传输来实现协议。 只要您向其发送了正确的数据、就可以正常工作。 我已经看到其他人使用 CC26xx SPI API 与 SD 卡成功通信。

    对于 SD 卡协议、您必须进行一些修改、MISO 必须设置为上拉、同时我们的 SPI 协议初始化为与此不同的配置。

    我建议您查看 MSP432 SDSPI 驱动程序并为 CC26xx 实施一个。 在 MSP432 SDSPI 驱动程序中、它还包括如何读取/写入 SD 卡。

    可在此处下载适用于 MSP432的 TI-RTOS:
    www.ti.com/.../MSP432-RTOS
    C:\ti_tirtos_msp43x_2_20_00_06\products\tidrivers_msp43x_2_20_00_08\packages/ti\drivers\sdspi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    非常感谢您的帮助。 我是否应该使用另一个 SSI、例如 SSI2或 SSI3并在"Board.c"中对其进行定义?
    此外、我是否应该定义除"比特率"之外的其他参数? 我应该为时钟定义 CPOL CPHA 模式、在哪里?

    提前感谢您的参与、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以在 SPICC26XXDMA.h 中找到有关如何初始化 SPI 的示例代码、或者 TI-RTOS 或 BLE 堆栈安装随附的 TI-RTOS 驱动程序文档。 (例如:C:/ti/tirtos_cc13xx_cc26xx_2_20_01_08/docs/Documentation_Overview_cc13xx_cc26xx.html)

    *//回调函数
    *静态空转移回调(SPI_Handle handle、SPI_Transaction *事务)
    *{
    * //开始另一个传输
    * SPI_TRANSFCTION (handle、transaction);
    *}
    *
    静态空 taskFxn (UARg a0、UARg A1)
    *{
    * SPI_Handle 句柄;
    * SPI_Params 参数;
    * SPI_Transaction 事务;
    * uint8_t buf[16]; //接收和发送缓冲区
    *
    //初始化 SPI 并指定非默认参数
    * SPI_Params_init (&params);
    * params.bitrate = 1000000;
    * params.frameFormat = SPI_POL1_PHA1;
    * params.mode = SPI_SLAVE;
    * Params.transferMode = SPI_MODE_CALLACK;
    * params.transferCallbackFxn = transferCallback;
    *
    //配置事务
    * transaction.count = 16;
    * transaction.txBuf = buf;
    * transaction.rxBuf = buf;
    *
    //打开 SPI 并启动第一个传输
    * 句柄= SPI_open (Board_SPI、params);
    * SPI_transfer (handle、&transaction);
    *
    * //永远等待
    * while (true);
    *} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Christin:

    非常感谢你的帮助。 它非常有价值、因为我仍然遇到与 SPI 相同的问题。

    我按照前面消息中所说的那样关注 MSP430库,我的 SDSPI_open()函数如下所示,使用以下命令,我相信我会告诉 SPI 与 CPOL 一起工作,CPHA = 0在主模式下。 我是否在正确的道路上? 非常感谢您宝贵的时间。

    --> SSIConfigSetExpClk (hwAttrs->baseAddr、freq.lo、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、400000、 8); 



    SDSPI_Handle SDSPICC2650_open (SDSPI_Handle handle、
    
    unsigned char drv、
    
    SDSPI_Params * params)
    
    {
    
    DRESULT DRESULT
    
    fresult;
    
    unsigned int 密钥;
    
    xdc_runtime_Types_FreqHz freq;
    
    TCAR 路径[3];
    
    SDSPICC2650_Object *对象= handle->object;
    
    SDSPICC2650_HWAttrs const * hwAttrs = handle->hwAttrs;
    
    object->driveNumber = drv;
    
    Hwi_restore (key);
    
    //存储 SDSPI 参数*
    
    if (params = NULL){
    
    /*没有传入参数,因此请使用默认值*/
    
    Params =(SDSPI_Params *)&SDSPI_defaultParams;
    
    }
    
    object->bitrate =(object->diskState =STA_NOINIT)? 400000:params->bitrate;
    
    IOCPinTypeSsiMaster (hwAttrs->baseAddr、hwAttrs->pinMISO、hwAttrs->pinMOSI、hwAttrs->pinCS、
    
    
    
    
    
    
    
    Value Attrs->pinSCK);//用于芯片选择的引脚// IOCPinTypeGpinotrs->pinotrup;hwAttrs->pinotrcs、hwpinotrise;pinotrcs (pinotrcs);/pinotrcs (pintrs);pinotrandpinattrs (pinattrs);pinotrise
    
    /*寄存器功率相关性-即为 SPI 加电和启用时钟。 //
    
    Power_setDependency (hwAttrs->powerMngrId);
    
    BIOS_getCpuFreq (&freq);
    
    SSIConfigSetExpClk (hwAttrs->baseAddr、freq.lo、SSI_FRF_MOTO_MODE_0、
    
    SSI_MODE_MASTER、400000、8);
    
    Log_print2 (Diags_User1、"SDSPI:(%p) CPU 频率:%d;SDSPI 频率至400000 kHz"、
    
    hwAttrs->baseAddr、freq.lo);
    
    SSIEnable (hwAttrs->baseAddr);
    
    //注册新的 disk_*()函数*/
    
    dresult = disk_register (object->driveNumber、
    
    SDSPICC2650_diskInitialize、
    
    SDSPICC2650_diskStatus、
    
    SDSPICC2650_diskRead、
    
    SDSPICC2650_diskWrite、
    
    SDSPICC2650_diskIoctrl);
    
    fresult = f_mount (&(object->filesystem)、path、0);
    
    if (fresult!= FR_OK){
    
    log_error2 ("SDSPI:(%p)驱动器%d 未安装"、
    
    hwAttrs->baseAddr、object->driveNumber);
    
    SDSPICC2650_Close (handle);
    
    return (NULL);
    
    }
    
    //存储此 FatFS 驱动器编号的新 SDSPI 句柄*/
    
    sdspiHandles[drv]=句柄;
    
    Log_Print1 (Diags_User1、"SDSPI:(%p) opened"、hwAttrs->baseAddr);
    
    return (句柄);
    
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Christin:

    我可以使用回调函数通过 SPI 读取/写入原始数据。 问题是我尝试将其与 SD 卡连接。 我按照 MSP432示例操作、无法理解 SPI 为何不响应。 为了更加精确、有时 SPI 会提供 MISO/MOSI 信号、有时不会提供任何信号、有时、我的逻辑分析仪会收到一条消息: "时钟设置与初始(空闲)状态不匹配"、前提是我给出了针对时钟 POL 和相位(在0和0处定义)的特定声明!
    您是否了解问题所在?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否修改了 CC26XX SPI 驱动程序(SPICC26XXDMA.c)以便正确配置 MISO (必须设置为上拉)引脚?
    我在您的代码中看不到任何 IO 初始化。

    您应该修改 SPICC26XXDMA.c 文件以确保 PIN_INIT 是正确的。 SPI 模块的引脚初始化可在函数 SPICC26XXDMA_INITIO 中找到
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Christin、

    在调用 SDSPI_init()之前,我构建了以下引脚表:
    PIN_Config SPIPinTable[]={
    BOARD_SPI0_CSn| PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
    BOARD_SPI0_MISO | PIN_INPUT_EN | PIN_PUL拉、
    BOARD_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLUDOWN、
    BOARD_SPI0_CLK | PIN_INPUT_EN | PIN_PUL拉、
    PIN_TERMINATE
    };

    PIN_Handle SPIPinHandle;//用于 SD 卡
    SPIPinHandle = PIN_OPEN (NewPinState、SPIPinTable);//打开 SD 引脚

    我已将它们声明为下拉!
    我将再次看到您在"SPICC26XXDMA.c"中提到的内容。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请查看 SPICC26XXDMA 文件、并使用那里的 API、而不是将其与引脚驱动器结合使用、这样会更容易。

    由于您不仅需要将引脚配置为下拉、还需要设置引脚多路复用器以将其用于 SSI 协议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    [1]如果我想让 SPI 与 CPOL=CPHA=0的时钟一起工作、是否有人可以向我正式提供 SPI 的4个引脚(MISO、MOSI、SCK、CS)的声明?

    [2]此外、SPI 使用主模式。 对吗?

    [3]如何向 SSI 说明先使用 MSB 还是 LSB?

    [4]我可以用哪个命令为 SSI 分配一个时钟频率?

    谢谢、