参照官方文档《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。
TI中文支持网


