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.

[参考译文] RTOS/CC2640:CC2640和 SPI 存在问题。 SPI 方法全部返回 true、但未接收到数据。

Guru**** 2540720 points
Other Parts Discussed in Thread: CC2640

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/570674/rtos-cc2640-issues-with-cc2640-and-spi-spi-method-all-return-true-but-no-data-received

器件型号:CC2640

工具/软件:TI-RTOS

您好!

我将 CC2640连接到16Mbit 闪存(S25FL116K0XNF)、并尝试从其写入和读取数据。 所有 SPI_TRANSFER 调用返回 true、并且传输状态字段为 SPI_TRANSACTION _COMPLETE 、但接收缓冲区未被填充。

以下是初始化代码:

大家好、

我有一个 CC2640连接到16Mbit 闪存(S25FL116K0XNF)、我正在尝试从该存储器中写入和读取数据。 所有 SPI_TRANSFER 调用返回 true、但接收缓冲区未被填充。 我正在使用阻塞模式、并且启用了 SPI。

以下是初始化代码: 
void memoryOpen (){
SPI_Params params;
SPI_Params_init (&params);

params.bitrate = 1000000;
params.frameFormat = SPI_POL1_PHA1;
params.mode = SPI_MASTER;
spiHandle = SPI_open (Board_SPI0、&params);
} 

要写入存储器的代码:

bmemoryWriteData (PIN_Handle pinHandle、char *数据、int 大小、int 地址){
char send[MAX_MEM_SIZE+4];
char receiv[MAX_MEM_SIZE];
SPI_Transaction transaction;

//写入数据02h + 3字节地址+数据
发送[0]= 0x02;
send[1]=地址和0xF0+





数据发送0xF0+地址;pin3 = 0xF0F0+地址= 0xF0+数据发送0xF0+地址= 0xF0+地址= 0xF0Pin = 0xF0Pin =地址;SEND =地址= 0xF0+地址= 0xF0PLE[END[END]; FLASH_CS、TRUE);

transaction.count = 4 + size;
transaction.txBuf = send;
transaction.rxBuf = receive;//此处也尝试了 NULL

bool 结果= SPI_transfer (spiHandle、&transaction);

PIN_setOutputValue (pinHandle、flash_CS、false);

返回结果;
} 

以及从存储器读取的非常相似的代码:
bool memoryReadData (PIN_Handle pinHandle、char *数据、int 大小、int 地址){
char send[MAX_MEM_SIZE];
char receiv[MAX_MEM_SIZE];
SPI_Transaction 事务;
bool 结果;

PIN_setOutputValue (pinHandle、 FLASH_CS、TRUE);

//命令03h + 3字节地址
SENSE[0]= 0x03;
SENSE[1]=地址和0xF00;
SENSE[2]=地址和0x0F0;
SENSE[3]=地址和0x00F;

transaction.count =大小;//假设大小> 4
transaction.Butxf =发送;
transaction.Buf =接收;rxBuf =接收; //这不包含 SPI_transfer 调用

结果= SPI_transfer (spiHandle、&transaction);

PIN_setOutputValue (pinHandle、flash_CS、false)之后的任何数据;

memcpy (data、(char*) transaction.rxBuf、size);

返回结果;
} 

因此、基本上我将按顺序调用上述3个调用、并检查读取的数据与写入的数据相同、而不是。

有几个问题、希望有人可以帮助:
1.我假设将 count 设置为要发送或接收的数据的较大值是正确的?
2.是设置 SPI 所需的任何其他操作,而不是调用 Board_initSPI()。
3.是否需要在引脚表配置中设置 SPI 引脚? (我已更改 board.h、因此 Board_SPI0_XXX 值正确)。

我还将其添加到了.cfg 文件中:
TIRTOS.useSPI = true;
var hwiParams = new halHwi.Params ();
hwiParams.instance.name ="dmaISR";
Program.global.dmaISR = halHwi.create (50、"&SPIisrDMA"、hwiParams); 

这到 board.c 中:

void SPIisrDMA (UARg arg)
{
SPI_serviceISR ((SPI_Handle)&(SPI_CONFIG[0]));
}

我还尝试了回调模式、回调函数会被调用。

我是否错过了什么?

谢谢、
Justin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉,语法突出显示器造成混乱,我似乎无法编辑它:-(
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以附加样片计划吗? 您使用的是哪个版本的 TI-RTOS?

    您看 一下:processors.wiki.ti.com/.../TI-RTOS_Examples_SerialFlash

    它是一个不同的器件和不同的 SPI 闪存、但概念是相同的。 看看非 FatFS 项目。

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

    谢谢 Todd、代码看起来非常相似、但也许它会告诉我错过了什么。

    谢谢、
    Justin