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.

[参考译文] CC1310:CC1310

Guru**** 1818760 points
Other Parts Discussed in Thread: CC1310, SEGGER
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1376044/cc1310-cc1310

器件型号:CC1310
主题中讨论的其他器件: SEGGER

工具与软件:

您好!
我一直在通过互联网查看几天知道,我找不到任何可以帮助我解决我的问题。
当前 IAM 与 CC1310和 IAM 一起工作、试图将旧版 PIC18微控制器的功能移植到它。 无线通信由处理  
Softwarestack、它提供一些 API 函数来与它交互、除了此堆栈是黑盒。 所有代码都在 tirtos 中的"主任务"中运行。
我需要使用 UART 和 SPI 与一些外部传感器和 EEPROM 进行通信。 UART 运行正常、TI 驱动程序函数位于两个单独的文件(.h 和.c)中。
但是、SPI 无法正常工作。 每次我尝试使用它时、我的代码都会崩溃。 通常我甚至不能使用调试器逐步完成。 我可能会在"exit.c"内陷入无休止的 for 循环。

只有当我的所有函数都与主任务位于同一文件中时、我才能使它正常工作。 这是很奇怪的、因为 UART 只包含我的模块的.h 文件就可以正常工作。  
我猜测它与内存分配有关。 我已经尝试在全局范围内声明我需要的所有变量,并尝试使用堆(malloc ()和 free ())。 我还尝试了调整任务堆栈的大小、但这对二者都没有帮助。 IAM 使用 Board_SPI1而不是0、因为无论实施如何、该通道都不起作用。
也许有人在这里有一个想法, 我做错了什么。

LAUNCHXL.h:

#define CC1310_LAUNCHXL_SPI1_MISO   IOID_2
#define CC1310_LAUNCHXL_SPI1_MOSI   IOID_1
#define CC1310_LAUNCHXL_SPI1_CLK     ioID_6
#define CC1310_LAUNCHXL_SPI1_CSn     ioID_7

LAUNCHXL.c:(#if 未被执行、我不使用 LaunchPad)

const PIN_Config BoardGpioInitTable[] =
{

#if (SF_CC13XX_TARGET == SF_TARGET_CC13X0_LP)
CC1310_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */
CC1310_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */
CC1310_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */
CC1310_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */
CC1310_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* External flash chip select */
CC1310_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master out - slave in */
CC1310_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master in - slave out */
CC1310_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI clock */
#endif /* SF_CC13XX_TARGET */
CC1310_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN, /* UART RX via debugger back channel */
CC1310_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW| PIN_PUSHPULL, /* UART TX via debugger back channel */
CC1310_LAUNCHXL_SPI1_MOSI | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master out - slave in */
CC1310_LAUNCHXL_SPI1_MISO | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master in - slave out */
CC1310_LAUNCHXL_SPI1_CLK | PIN_INPUT_EN | PIN_PULLDOWN,
PIN_TERMINATE };

我的 SPI.c:

bool loc_spi_init ()

Bool RetVal = false;

//使用默认参数初始化 SPI
SPI_PARAMS_INIT (&spiParams);
spiParams.dataSize = 8;
spiParams.bitrate = 4000000;
spiParams.mode = SPI_MASTER;
spiParams.transferMode = SPI_MODE_BLOCKING;
spiParams.transferTimeout = SPI_WAIT_FOREVER;
spiParams.transferCallbackFxn = NULL;

spiHandle = SPI_open (Board_SPI1、&spiParams);
if (spiHandle =0)

返回值;
}
设计

retval = true;
}

返回值;

}

bool loc_spi_WriteRead(uint8_t spiSendBuffer[], uint8_t spiRecvBuffer[],
uint8_t size)
{
spiHandle = SPI_open(Board_SPI1, &spiParams);
SPI_Transaction stTransaction;
bool spiTransferOk = false;

// Populating the struct
stTransaction.count = size;
stTransaction.txBuf = (void*) spiSendBuffer;
stTransaction.rxBuf = (void*) spiRecvBuffer;

spiTransferOk = SPI_transfer(spiHandle, &stTransaction);
SPI_close(spiHandle);
return spiTransferOk;
}

IAM、使用 SEGGER j-link 配置编程和调试以及 CCS 版本12。

Simplelink 版本是4.20.02.07。

我还使用了运行时对象视图来查看任务堆栈是否溢出(实际上并非如此)。
提前感谢。

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

    void loc_read_EEPROM(TUINT16 AdrEEPROM, uint8_t *RecvBuffer, size_t RecvSize)
    {
        uint8_t spiSend_RegAdr[] = { READ, (TUINT16) AdrEEPROM >> 8,
                                    (TUINT16) AdrEEPROM & (TUINT16) 0xFF };
    
        size_t sendSizeSPI = sizeof(spiSend_RegAdr) + RecvSize;
    
        if (!loc_spi_WriteRead(spiSend_RegAdr, RecvBuffer, sendSizeSPI))
        {
           while (1)
                ; // Failed
        }
    //}

    抱歉、我忘记了这个函数。

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

    尊敬的 GBU:

    查看您的 loc_spi_init、我看到您正在调用 SPI_open。

    但是loc_spi_WriteRead、在中、也调用 spi_open。 然后,我相信事故可能来自那里。

    您应该摆脱 loc_spi_init 中的 SPI_open 调用。

    此致、

    Arthur

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

    嗨、Arthur、
    这确实解决了问题、我想我只需要第二对眼睛。 非常感谢。