工具/软件:
我已为 CC2745 安装最新的 SDK (simplelink_lowpower_f3_SDK_9_11_00_18)。 并使用 SPI 与其他外设通信。 发送 SPI 信号时、没有正确获得时钟。 但 1MHz 比特率下的 MOSI 信号似乎正常。
在 SPI 中 、我将 CC2745 视为控制器。 比特率 1MHz。

也会在一个发送代码卡滞后发生 硬故障处理程序、
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.
工具/软件:
我已为 CC2745 安装最新的 SDK (simplelink_lowpower_f3_SDK_9_11_00_18)。 并使用 SPI 与其他外设通信。 发送 SPI 信号时、没有正确获得时钟。 但 1MHz 比特率下的 MOSI 信号似乎正常。
在 SPI 中 、我将 CC2745 视为控制器。 比特率 1MHz。

也会在一个发送代码卡滞后发生 硬故障处理程序、
您好、
/*
* ======== spicontroller.c ========
*/
#include <stddef.h>
#include <stdint.h>
#include <string.h>
/* POSIX Header files */
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/SPI.h>
#include <ti/display/Display.h>
/* Driver configuration */
#include "ti_drivers_config.h"
#define THREADSTACKSIZE (1024)
#define SPI_MSG_LENGTH (256)
#define CONTROLLER_MSG ("Hello from controller, msg#: ")
#define MAX_LOOP (10)
#ifdef DeviceFamily_CC35XX
#define CONFIG_GPIO_LED_0 GPIO_INVALID_INDEX
#define CONFIG_GPIO_LED_1 GPIO_INVALID_INDEX
#endif
uint8_t example_string[270]={0xAA,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0xFF };
unsigned char controllerRxBuffer[SPI_MSG_LENGTH];
unsigned char controllerTxBuffer[SPI_MSG_LENGTH];
/* Semaphore to block controller until peripheral is ready for transfer */
sem_t controllerSem;
void spiCallbackFxn(SPI_Handle controllerSpi, SPI_Transaction *tran);
/* Default SPI parameters structure */
const SPI_Params NFC_SPI = {
SPI_MODE_CALLBACK, /* transferMode */
1000, /* transferTimeout */
spiCallbackFxn, /* transferCallbackFxn */
SPI_CONTROLLER, /* mode */
1000000, /* bitRate */
8, /* dataSize */
SPI_POL0_PHA0, /* frameFormat */
NULL /* custom */
};
/*
* ======== peripheralReadyFxn ========
* Callback function for the GPIO interrupt on CONFIG_SPI_PERIPHERAL_READY.
*/
void peripheralReadyFxn(uint_least8_t index)
{
sem_post(&controllerSem);
}
SPI_Handle controllerSpi ; //controllerSpi; //SPI_config
SPI_Params spiParams;
SPI_Transaction transaction;
SPI_Mode Controller = SPI_CONTROLLER;
uint32_t i;
bool transferOK;
int32_t status;
/*
* ======== controllerThread ========
* Controller SPI sends a message to peripheral while simultaneously receiving a
* message from the peripheral.
*/
void SPI_Init(void )
{
SPI_init();
/* Open SPI as controller (default) */
// SPI_Params_init(&NFC_SPI);
controllerSpi = SPI_open(Controller, &NFC_SPI);
/*
* Controller has opened CONFIG_SPI_CONTROLLER; set
* CONFIG_SPI_CONTROLLER_READY low to inform the peripheral.
*/
// GPIO_write(CONFIG_GPIO_SPI_0_CSN, 1);
/* Initialize controller SPI transaction structure */
// controllerTxBuffer[sizeof(CONTROLLER_MSG) - 1] = (i % 10) + '0';
transaction.count = 8;
transaction.txBuf = (void *)controllerTxBuffer;
transaction.rxBuf = (void *)controllerRxBuffer;
}
void spiCallbackFxn(SPI_Handle controllerSpi, SPI_Transaction *tran)
{
sem_t *semPtr = (sem_t *)(tran->arg);
// Post the semaphore if our transaction was more than LIMIT
if (tran->status == SPI_STATUS_SUCCESS ){//&& tran->count > LIMIT) {
sem_post(semPtr);
}
}
_Bool SPI_Sts_Info=0;
void SPI_Tx_test(void){
/* Perform SPI transfer */
// GPIO_write(CONFIG_GPIO_SPI_0_CSN, 0);
transaction.txBuf = (void *)example_string;
transferOK = SPI_transfer(controllerSpi, &transaction);
if (transferOK)
{
SPI_Sts_Info=1;
}
else
{
SPI_Sts_Info=0;
}
SPI_close(controllerSpi);
}您好、
您将哪个器件用作外设、在开始传输之前、您是否能够建立握手或至少初始连接? 另外、您能否发送输出/错误的图片、以便我准确地看到您收到了什么消息?
但是、在对代码进行初始审阅时、我建议使用库 SPI_Params_init ()、然后手动更改参数。 这将根据堆栈默认值初始化参数、因此它将确保结构遵循 spi_open () 所需的格式。 另外,我注意到你有 spi_Init () 和 spi_tx_test () 作为单独的函数,但我看不到主函数显示了你如何调用这两个函数。 如果您有一个函数、查看该函数会有所帮助、以便我可以按照什么顺序调用这些函数。
谢谢
您好、
我用逻辑分析仪捕捉
目前我只测试传输,在上面的屏幕短时钟不正确,但 MOSI 信号是完美的传输。
传输成功后、我无法在 spiCallbackFxn 获取回调、
在 “ transferOK = SPI_transfer (controllerSpi、&transfertion);“中、此处返回状态显示为 1 (transferOK)。
我 以 1ms 计时器回调在 1 秒的时间间隔内调用“SPI_Tx_test ()“函数。
在第一次传输后、我能够得到一次计时器回调。
我在 SPI 时钟中修改了代码、但响应几乎相同
/*
* ======== spicontroller.c ========
*/
#include <stddef.h>
#include <stdint.h>
#include <string.h>
/* POSIX Header files */
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/SPI.h>
#include <ti/display/Display.h>
/* Driver configuration */
#include "ti_drivers_config.h"
#define THREADSTACKSIZE (1024)
#define SPI_MSG_LENGTH (256)
#define CONTROLLER_MSG ("Hello from controller, msg#: ")
#define MAX_LOOP (10)
#ifdef DeviceFamily_CC35XX
#define CONFIG_GPIO_LED_0 GPIO_INVALID_INDEX
#define CONFIG_GPIO_LED_1 GPIO_INVALID_INDEX
#endif
uint8_t example_string[270]={0xAA,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0xFF };
unsigned char controllerRxBuffer[SPI_MSG_LENGTH];
unsigned char controllerTxBuffer[SPI_MSG_LENGTH];
/* Semaphore to block controller until peripheral is ready for transfer */
sem_t controllerSem;
void spiCallbackFxn(SPI_Handle controllerSpi, SPI_Transaction *tran);
/* Default SPI parameters structure */
// const SPI_Params NFC_SPI = {
// SPI_MODE_CALLBACK, /* transferMode */
// 100, /* transferTimeout */
// spiCallbackFxn, /* transferCallbackFxn */
// SPI_CONTROLLER, /* mode */
// 1000000, /* bitRate */
// 8, /* dataSize */
// SPI_POL0_PHA0, /* frameFormat */
// NULL /* custom */
// };
/*
* ======== peripheralReadyFxn ========
* Callback function for the GPIO interrupt on CONFIG_SPI_PERIPHERAL_READY.
*/
void peripheralReadyFxn(uint_least8_t index)
{
sem_post(&controllerSem);
}
SPI_Handle controllerSpi ; //controllerSpi; //SPI_config
SPI_Params NFC_SPI;
SPI_Transaction transaction;
SPI_Mode Controller = SPI_CONTROLLER;
uint32_t i;
bool transferOK;
int32_t status;
/*
* ======== controllerThread ========
* Controller SPI sends a message to peripheral while simultaneously receiving a
* message from the peripheral.
*/
void SPI_Init(void )
{
SPI_init();
/* Open SPI as controller (default) */
SPI_Params_init(&NFC_SPI);
NFC_SPI.transferMode = SPI_MODE_CALLBACK, /* transferMode */
// NFC_SPI.transferTimeout= 100, /* transferTimeout */
NFC_SPI.transferCallbackFxn= spiCallbackFxn, /* transferCallbackFxn */
NFC_SPI.mode = SPI_CONTROLLER, /* mode */
NFC_SPI.bitRate = 1000000, /* bitRate */
NFC_SPI.dataSize = 8, /* dataSize */
NFC_SPI.frameFormat = SPI_POL0_PHA0, /* frameFormat */
controllerSpi = SPI_open(Controller, &NFC_SPI);
/*
* Controller has opened CONFIG_SPI_CONTROLLER; set
* CONFIG_SPI_CONTROLLER_READY low to inform the peripheral.
*/
// GPIO_write(CONFIG_GPIO_SPI_0_CSN, 1);
/* Initialize controller SPI transaction structure */
// controllerTxBuffer[sizeof(CONTROLLER_MSG) - 1] = (i % 10) + '0';
transaction.count = 8;
transaction.txBuf = (void *)controllerTxBuffer;
transaction.rxBuf = (void *)controllerRxBuffer;
}
void spiCallbackFxn(SPI_Handle controllerSpi, SPI_Transaction *tran)
{
sem_t *semPtr = (sem_t *)(tran->arg);
// Post the semaphore if our transaction was more than LIMIT
if (tran->status == SPI_STATUS_SUCCESS ){//&& tran->count > LIMIT) {
sem_post(semPtr);
}
}
_Bool SPI_Sts_Info=0;
void SPI_Tx_test(void){
/* Perform SPI transfer */
// GPIO_write(CONFIG_GPIO_SPI_0_CSN, 0);
transaction.txBuf = (void *)example_string;
transferOK = SPI_transfer(controllerSpi, &transaction);
if (transferOK)
{
SPI_Sts_Info=1;
}
else
{
SPI_Sts_Info=0;
}
// SPI_close(controllerSpi);
}尊敬的 Anto:
根据您提供的代码、我看到您没有任何条件检查外设是否实际可以进行传输。 如果您在不断传输信号而没有持续检查外围设备是否也已就绪、您将看到您当前正在观察的行为、并且 callbackFxn 将只在第一次工作。 因此,我建议,除了计时器回调/中断之外,你还初始化与 GPIO 或其他信号相关联的信标,该信号向 SPI 协议发出信号,即设备已准备好在实际调用 spi_transfer() 之前传输。
Eshaan