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

CC2640:使用SPI进行PTM测试,但是测试失败

使用SDK中的host_test 例程进行PTM测试,测试成功。SDK中的host_test 例程默认使用UART。将UART替换成SPI之后,PTM测试失败。请问哪里出错?

我的详细步骤和问题描述如下:
1、使用SDK中的host_test 例程,使用默认的UART接口进行PTM测试
(1)SDK中的host_test 例程的路径见“6附件(1)”

(2)根据教学视频,安装HCI TESTER、在CC2640R2 LAUNCHPAD上运行host_test例程,证明PTM测试成功。如图1所示。教学视频的链接见“6附件(2)”

图1

(3)transmit test的HCI命令如图2所示。

图2

2、将host_test 例程的默认接口改成SPI
(1)修改host_test 例程的predefined symbols,打开NPI_USE_SPI宏定义,如图3所示

图3

(2)在CC2640R2 LAUNCHPAD上运行修改后的host_test 例程

3、编写SPI MASTER,发送HCI命令,进行PTM测试
(1)部分宏定义和参数定义如下所示:

#define SPI_TX_FIELD_LEN4
#define SPI_TX_HDR_LEN3
#define SPI_TX_ZERO_PAD_INDEX0
#define SPI_TX_SOF_INDEX1
#define SPI_TX_LEN_INDEX2

#define SPI_RX_FIELD_LEN3
#define SPI_RX_HDR_LEN2
#define SPI_RX_SOF_INDEX0/*每一帧的第0个字节为0XFE*/
#define SPI_RX_LEN_INDEX1/*每一帧的第1个字节表示数据域长度*/
#define SPI_RX_DATA_INDEX2

uint8_t TransportTxBuf[32]={0x00,};
uint8_t TransportRxBuf[32]={0x00,};

uint8_t TransportTxBufLen = 0;

(2)SPI的配置和接口定义如下所示:

SPI_init();  // Initialize the SPI driver// Init SPI and specify non-default parametersSPI_Params_init(&params);params.bitRate= 1000000;params.dataSize= 8;// 8-bit data sizeparams.frameFormat = SPI_POL1_PHA1;params.mode= SPI_MASTER;params.transferMode= SPI_MODE_BLOCKING;// Configure the transactiontransaction.count = sizeof(signature);transaction.txBuf = (void *)signature;transaction.rxBuf = NULL;// Open the SPI and perform the transferhandle = SPI_open(Board_SPI0, &params);

(3)由于NPI_SPI与NPI_UART的帧结构不同,因此SPI MASTER发送数据,需要按照帧结构发送。帧结构的定义的链接见“6附件(3)”。

(4)由于NPI_SPI使用的是SPI_POL1_PHA1模式,因此SPI MASTER发送数据的时候,需要在帧头添加“0x00”。SPI_transfer_frame_write()的定义如下所示:

static void SPI_transfer_frame_write(SPI_Handle handle, SPI_Transaction *transaction, uint8_t *txBuf ,uint8_t len)
{int16_t i = 0;TransportTxBufLen = len + SPI_TX_FIELD_LEN;TransportTxBuf[SPI_TX_ZERO_PAD_INDEX] = 0x00;TransportTxBuf[SPI_TX_SOF_INDEX] = SPI_SOF;TransportTxBuf[SPI_TX_LEN_INDEX] = len;for( i = ( len - 1 ) ; i >= 0 ; i-- ){TransportTxBuf[i + SPI_TX_HDR_LEN] = txBuf[i];}TransportTxBuf[TransportTxBufLen - 1] =NPITLSPI_calcFCS(&TransportTxBuf[SPI_TX_LEN_INDEX],len + 1);transaction->count = TransportTxBufLen;transaction->txBuf = TransportTxBuf;transaction->rxBuf = NULL;SPI_transfer(handle, transaction);

}

(5)SPI MASTER读数据的时候,发送0x00即可。SPI_transfer_frame_read()的定义如下所示:

static void SPI_transfer_frame_read(SPI_Handle handle, SPI_Transaction *transaction,uint8_t len)
{transaction->count = (len+3);transaction->txBuf = NULL;transaction->rxBuf = TransportRxBuf;SPI_transfer(handle, transaction);
}

(6)mainThread中的主循环如下所示:

void *mainThread(void *arg0)
{......./* Loop forever echoing */while (1){/*transmit test*/SPI_transfer_frame_write(handle, &transaction,frame_transmit_write,frame_transmit_write_len);SPI_transfer_frame_read(handle, &transaction,frame_transmit_read_len);/*end test*/SPI_transfer_frame_write(handle, &transaction,frame_end_write,frame_end_write_len);SPI_transfer_frame_read(handle, &transaction,frame_end_read_len);/*receive test*/SPI_transfer_frame_write(handle, &transaction,frame_receive_write,frame_receive_write_len);SPI_transfer_frame_read(handle, &transaction,frame_receive_read_len);/*end test*/SPI_transfer_frame_write(handle, &transaction,frame_end_write,frame_end_write_len);SPI_transfer_frame_read(handle, &transaction,frame_end_read_len);}
}

(7)完整的工程代码,见“6附件(4)”

4、测试结果失败
(1)SPI MASTER发送一帧数据之后,再进行读取,却没有读到任何数据。SPI波形如图4所示。

图4

(2)SPI MASTER在读取数据的时候,即使连续发送1000个0x00,依旧没有读到任何数据。

5、失败原因分析
(1)使用默认的UART接口进行PTM transmit test测试,发送的HCI命令为“01 1E 20 03 00 00 00”。
(2)当改成SPI接口进行PTM transmit test测试,发送的HCI命令为“00 FE 07 01 1E 20 03 00 00 00 3B”。请问这个命令是否正确?

6、附件
(1)SDK中的host_test 例程的路径
C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\blestack\host_test

(2)PTM测试教学视频链接

(3)NPI的帧结构定义的链接

(4)SPI MASTER完整的工程代码

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

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

7、开发环境
CCS:Code Composer Studio 7.2.0
SDK:simplelink_cc2640r2_sdk_1_40_00_45
hardware:CC26640R2 launchpad develop kit
系统:win7 64 位

Alvin Chen:

我建议你使用下面的方式,即为桥接的方式去测试。
processors.wiki.ti.com/…/Cc2640_Adding_a_UART_or_SPI_driver_to_a_Sample_Project

Alvin Chen:

回复 Alvin Chen:

Viki Shi:

请参考这个文档来进行PTM的测试:processors.wiki.ti.com/…/PTM_cc2640

heng fu:

回复 Viki Shi:

上述文档不是最新版。应该参考SDK中的最新版PTM指南,其路径如下:
file:///C:/ti/simplelink_cc2640r2_sdk_1_40_00_45/docs/blestack/ble_user_guide/html/ble-stack-3.x/creating-a-custom-bluetooth-low-energy-application.html#using-production-test-mode-ptm

heng fu:

回复 Alvin Chen:

我使用了两块CC2640R2 LAUNCHPAD , 分别作为SPI MASTER 和SPI SLAVE。

SPI SLAVE 就是host test app , SPI MASTER发送PTM HCI COMMAND。在这种接线方式下,不需要桥接。

具体的引脚连接,参见如下帖子:
e2e.ti.com/…/693787

heng fu:

回复 Alvin Chen:

桥接只是一种接线方式,并无法解决我的问题。

如果使用host test app中默认的UART接口,PTM可以成功。但是我现在需要使用SPI作为PTM接口,然后失败。我的问题很可能就是SPI HCI COMMAND发送错误。请帮忙检查我的SPI MASTER HCI COMMAND发送函数,也就是这个函数:SPI_transfer_frame_write

heng fu:

我使用两块CC2640 LAUNCHPAD进行测试。分别作为SPI MASTER 和SPI SLAVE 。 其中,SPI MASTER发送HCI COMMAND,SPI SLAVE就是host test app .

两块开发板的SPI接口连在一起,参见如下图片:

Hank Zhang:

回复 heng fu:

请问你是怎么修改默认UART的,因为PTM测试需要烧录host_test ,默认的是DIO 2,3怎么修改为其他的DIO

赞(0)
未经允许不得转载:TI中文支持网 » CC2640:使用SPI进行PTM测试,但是测试失败
分享到: 更多 (0)