TI中文支持网
TI专业的中文技术问题搜集分享网站

如何利用NPI_SPI,使得两块CC2640 LAUNCHPAD之间能够实现通信?

参照官方文档《Cc2640_Adding_a_UART_or_SPI_driver_to_a_Sample_Project》,将NPI_SPI添加到simple_peripheral工程中。但是该官方文档适用于SPI SLAVE,却不适用于SPI MASTER。请问如何修改官方文档中提供的代码,才可以使NPI_SPI MASTER与NPI_SPI SLAVE之间实现通信?

我的详细操作步骤如下。
1、我使用两块CC2640 LAUNCHPAD,分别作为SPI MASTER和SPI SLAVE。两块板子上都运行simple_peripheral工程。

2、在1号CC2640 LAUNCHPAD上,根据官方文档《Cc2640_Adding_a_UART_or_SPI_driver_to_a_Sample_Project》,将NPI_SPI添加到simple_peripheral工程中。

(1)下载“tl.h”和“tl.c ”文件,下载路径见附件7(8)和7(9)

(2)根据官方文档的9个步骤,将NPI_SPI添加到simple_peripheral工程中。添加完成后,如图1所示。

图1

(3)根据官方文档《NPI》,NPI_SPI有SRDY和MRDY两根线,因此需要在simple_peripheral工程中添加宏定义“NPI_FLOW_CTRL”,如图2所示

图2

(4)打开npi_tl.c文件,找到MRDY_PIN和SRDY_PIN的定义,如图3所示。发现该引脚分别对应Board_BUTTON0和Board_BUTTON1,如图4所示。

图3

图4

(5)打开npi_tl_spi.c文件,找到NPITLSPI_initializeTransport函数,发现SPI为SLAVE,如下所示。

void NPITLSPI_initializeTransport(Char *tRxBuf, Char *tTxBuf, npiCB_t npiCBack)
{SPI_Params spiParams;TransportRxBuf = tRxBuf;TransportTxBuf = tTxBuf;npiTransmitCB = npiCBack;// Initialize the SPI driverBoard_initSPI();// Configure SPI parametersSPI_Params_init(&spiParams);// Slave modespiParams.mode = SPI_SLAVE;spiParams.bitRate = SPI_SLAVE_BAUD_RATE;spiParams.frameFormat = SPI_POL1_PHA1;spiParams.transferMode = SPI_MODE_CALLBACK;spiParams.transferCallbackFxn = NPITLSPI_CallBack;// Attempt to open SPIspiHandle = SPI_open(NPI_SPI_CONFIG, &spiParams);return;
}

(6)将配置完成后的代码下载到1号CC2640 LAUNCHPAD上并运行

3、在2号CC2640 LAUNCHPAD上,修改NPI_SPI的相关配置,使之适用于SPI MASTER

(1)打开npi_tl_spi.c文件,找到NPITLSPI_initializeTransport函数,配置为SPI MASTER模式,如下所示

void NPITLSPI_initializeTransport(Char *tRxBuf, Char *tTxBuf, npiCB_t npiCBack)
{SPI_Params spiParams;TransportRxBuf = tRxBuf;TransportTxBuf = tTxBuf;npiTransmitCB = npiCBack;// Initialize the SPI driverBoard_initSPI();// Configure SPI parametersSPI_Params_init(&spiParams);// Slave modespiParams.mode = SPI_MASTER;spiParams.bitRate = SPI_SLAVE_BAUD_RATE;spiParams.frameFormat = SPI_POL1_PHA1;spiParams.transferMode = SPI_MODE_CALLBACK;spiParams.transferCallbackFxn = NPITLSPI_CallBack;// Attempt to open SPIspiHandle = SPI_open(NPI_SPI_CONFIG, &spiParams);return;
}

(2)打开simple_peripheral.c文件,找到SimpleBLEPeripheral_TLpacketParser函数。该函数中首先执行TLread(appRxBuf, len),然后执行TLwrite(appRxBuf, len),如下所示。但是这只适用于SPI SLAVE,请问应该如何修改,才能够适用于SPI MASTER?

#if defined (NPI_USE_UART) || defined (NPI_USE_SPI)
static void SimpleBLEPeripheral_TLpacketParser(void)
{//read available bytesuint8_t len = TLgetRxBufLen();if (len >= APP_TL_BUFF_SIZE){len = APP_TL_BUFF_SIZE;}TLread(appRxBuf, len);// ADD PACKET PARSER HERE// for now we just echo...TLwrite(appRxBuf, len);
}
#endif //TL

4、连接两块CC2640 LAUNCHPAD,接线示意图如图5所示。分别运行上述代码,但是发现通信失败。请问哪里配置出错?

图5

5、在SDK中可以找到“npi_tl_uart_m.c”文件,该文件适用于NPI UART MASTER。请问SDK中有没有适用于NPI SPI MASTER的对应文件?

6、附件
(1)1号CC2640 LAUNCHPAD上的NPI SPI SLAVE的源代码可在这里下载:

spi_slave.rar

(2)2号CC2640 LAUNCHPAD上的NPI SPI MASTER的源代码可在这里下载:

spi_master.rar

(3)官方文档《Cc2640_Adding_a_UART_or_SPI_driver_to_a_Sample_Project》可在这里下载:

(4)官方文档《NPI》可在这里下载:

(5)simple_peripheral工程在我的SDK中的位置

C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\blestack\simple_peripheral

(6)simplelink_cc2640r2_sdk_1_40_00_45 可从如下路径下载:

(7)CC2640R2 launchpad 可从这里购买:

(8)“tl.h”下载路径

(9)“tl.c ”下载路径

7、我的开发环境
CCS:Code Composer Studio 7.2.0
SDK:simplelink_cc2640r2_sdk_1_40_00_45
hardware:CC26640R2 launchpad develop kit
VS: Microsoft Visual C++ 2010 Express
系统:win7 64 位

Viki Shi:

这个我记得你在E2E问过,已经有工程师回答了: e2e.ti.com/…/680824

heng fu:

回复 Viki Shi:

上一篇帖子中的问题,是关于SPI 驱动的。这篇帖子的问题,是关于NPI的。NPI对SPI进行了封装,NPI是SPI的上层应用。

上一篇帖子的问题已经解决,且解决方法已经附在帖子末尾。

两篇帖子虽然都涉及到SPI,但是问题的层次不同。这个帖子的问题的详细描述,请参见描述的内容2。

赞(0)
未经允许不得转载:TI中文支持网 » 如何利用NPI_SPI,使得两块CC2640 LAUNCHPAD之间能够实现通信?
分享到: 更多 (0)