Part Number:CC1310
1.cc1310,在使用的两个spi时,一个外接传感器,一个外接sd卡,无法同时使用,使用一个时,另外一个spi打开失败
Cherry Zhou:
您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!
,
desheng li:
static int sdspiinit(void){ SD_Handle sdHandle; uint8_t result; SD_init(); sdHandle = SD_open(Board_SD0, NULL); if (sdHandle == NULL) { while (1); } result = SD_initialize(sdHandle); if (result != SD_STATUS_SUCCESS) { while (1); } sd.handle = sdHandle; GPIO_write(CC1310_LAUNCHXL_SPI0_CSN,0); return 0;}
static int memsSpiInit(void){ SPI_Params spiParams; SPI_Handle memsSpiHandle; SPI_init(); // SPI_Params_init(&spiParams); / spiParams.mode = SPI_MASTER; //spiParams.bitRate = 5000000; spiParams.bitRate = 4000000; spiParams.dataSize = 8; spiParams.frameFormat = SPI_POL1_PHA1; memsSpiHandle = SPI_open(Board_SPI1, &spiParams); if( memsSpiHandle==NULL ) { //SPI_open() failed, Error opening SPI SPI_close(memsSpiHandle); return -1; //while (1); } return 0;}
前后运行这两个函数,后面的那个打开为NULL。
,
Cherry Zhou:
好的收到您提供的信息,已经跟进给工程师了,如有答复将尽快回复您。谢谢!
,
Cherry Zhou:
您好,请问下 Board_SD0 和 Board_SPI1 的定义是?
,
desheng li:
#define Board_SD0 CC1310_LAUNCHXL_SDSPI0
#define Board_SPI1 CC1310_LAUNCHXL_SPI1
#define CC1310_LAUNCHXL_SPI0_MISO IOID_14 /* RF1.20 */ //闪存SD卡对应的引脚#define CC1310_LAUNCHXL_SPI0_MOSI IOID_15 /* RF1.18 */#define CC1310_LAUNCHXL_SPI0_CLK IOID_10 /* RF1.16 */#define CC1310_LAUNCHXL_SPI0_CSN IOID_11#define CC1310_LAUNCHXL_SPI1_MISO IOID_5 //传感器对应的引脚#define CC1310_LAUNCHXL_SPI1_MOSI IOID_6#define CC1310_LAUNCHXL_SPI1_CLK IOID_10#define CC1310_LAUNCHXL_SPI1_CSN IOID_4
是这样定义的,
,
Cherry Zhou:
好的收到,反馈给工程师了哈。
,
YiKai Chen:
SPI是共用的,你只能init一個,然後使用不同的CS腳位去控制一个外接传感器和另一个外接sd卡
,
desheng li:
两个SPI,CLK是共用的,您说的是SD_init和spi_init,只能init一个?
,
YiKai Chen:
對,因為SD_init最後還是會調用SPI_init
,
desheng li:
SD_init(); sdspiinit(); //sd init memsSpiInit(); //spi init
static int sdspiinit(void){ SD_Handle sdHandle; uint8_t result; sdHandle = SD_open(Board_SD0, NULL); if (sdHandle == NULL) { while (1); } result = SD_initialize(sdHandle); if (result != SD_STATUS_SUCCESS) { while (1); } sd.handle = sdHandle; return 0;}
static int memsSpiInit(void){ SPI_Params spiParams; SPI_Handle memsSpiHandle;// SPI_init(); SPI_Params_init(&spiParams); spiParams.mode = SPI_MASTER; spiParams.bitRate = 3000000; spiParams.dataSize = 8; spiParams.frameFormat = SPI_POL1_PHA1; memsSpiHandle = SPI_open(Board_SPI1, &spiParams); if( memsSpiHandle==NULL ) { //SPI_open() failed, Error opening SPI SPI_close(memsSpiHandle); return -1; //while (1); } return 0;}
,这样写,还是会失败
,
YiKai Chen:
你SPI_open也不能在沒有SPI_close前重複調用
,
desheng li:
您好,把SPI_close注释掉,SPI_open打开还是null, 你们是怎么使用两个spi的
,
desheng li:
SPI_Handle sdHandle; SPI_Handle sdHandle0;
GPIO_init(); SPI_init();
sdHandle = SPI_open(Board_SPI0, NULL); sdHandle0 = SPI_open(Board_SPI1, NULL); if (sdHandle == NULL) { Display_printf(display, 0, 0, "Error starting the SD card\n"); while (1); } if (sdHandle0 == NULL) { Display_printf(display, 0, 0, "Error starting thespi\n"); while (1); }
这样写, sdHandle0 = SPI_open(Board_SPI1, NULL);打开为NULL;还是打不开
,
YiKai Chen:
你的Board_SPI0/Board_SPI1定義是什麼?
,
desheng li:
CC1310_LAUNCHXL.h
#define CC1310_LAUNCHXL_SPI1_MISO IOID_5 /* RF1.20 */ //sensor#define CC1310_LAUNCHXL_SPI1_MOSI IOID_6 /* RF1.18 */#define CC1310_LAUNCHXL_SPI1_CLK IOID_10 /* RF1.16 */#define CC1310_LAUNCHXL_SPI1_CSN IOID_4#define CC1310_LAUNCHXL_SPI0_MISO IOID_14 //sd#define CC1310_LAUNCHXL_SPI0_MOSI IOID_15#define CC1310_LAUNCHXL_SPI0_CLK IOID_10#define CC1310_LAUNCHXL_SPI0_CSN IOID_11
Board.h
#define Board_SPI0 CC1310_LAUNCHXL_SPI0#define Board_SPI1 CC1310_LAUNCHXL_SPI1
分别是这样定义的
,
YiKai Chen:
你SPI_open的第二個參數要處理,如下:
SPI_HandlemasterSpi;SPI_ParamsspiParams;/* Open SPI as master (default) */SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL0_PHA1;spiParams.bitRate = 4000000;masterSpi = SPI_open(Board_SPI1, &spiParams);
,
desheng li:
SPI_Handle sdHandle; SPI_Handle sdHandle0; GPIO_init(); SPI_init(); SPI_Params spiParams; SPI_Params spiParams0; SPI_Params_init(&spiParams); spiParams.mode = SPI_MASTER; spiParams.bitRate = 3000000; spiParams.dataSize = 8; spiParams.frameFormat = SPI_POL1_PHA1; SPI_Params_init(&spiParams0); spiParams0.mode = SPI_MASTER; spiParams0.bitRate = 3000000; spiParams0.dataSize = 8; spiParams0.frameFormat = SPI_POL0_PHA1; sdHandle = SPI_open(Board_SPI0, &spiParams); sdHandle0 = SPI_open(Board_SPI1, &spiParams0);
这样写,第二个还是不可以
,
YiKai Chen:
我用下面的程序取代sdraw mainThread理的程序去測試SPI open,是沒問題的
SPI_HandlemasterSpi0;SPI_ParamsspiParams0;SPI_HandlemasterSpi;SPI_ParamsspiParams;SPI_init();/* Open SPI as master (default) */SPI_Params_init(&spiParams0);spiParams0.frameFormat = SPI_POL0_PHA1;spiParams0.bitRate = 4000000;masterSpi0 = SPI_open(Board_SPI0, &spiParams0);if (masterSpi0 == NULL) {Display_printf(display, 0, 0, "Error initializing master SPI 0\n");while (1);}else {Display_printf(display, 0, 0, "Master SPI 0 initialized\n");}SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL0_PHA1;spiParams.bitRate = 4000000;masterSpi = SPI_open(Board_SPI1, &spiParams);if (masterSpi == NULL) {Display_printf(display, 0, 0, "Error initializing master SPI\n");while (1);}else {Display_printf(display, 0, 0, "Master SPI initialized\n");}
,
desheng li:
使用您的程序。第二个还是打不开?
CC1310_LAUNCHXL.c,这里面有没有哪些地方需要修改的
,
YiKai Chen:
重新安裝SDK然後用全新的程序試試看吧,我這邊測試是沒問題的
,
desheng li:
您好,当CLK没有共用时,可以打开,可能是CLK共用的问题?CLK不是可以共用么?
,
YiKai Chen:
你用兩組不同的spi,所有的spi腳位包和CLK都是不可以共用的
,
desheng li:
spi 多个设备,cs不共用,不就可以么,
,
YiKai Chen:
要cs不共用,其他腳位共用,你只能開一組SPI
,
desheng li:
GPIO_write(CC1310_LAUNCHXL_SPI0_CSN,1);
我还有一个问题,片选信号,这样写,可以实现拉高么?
,
YiKai Chen:
可以
,
desheng li:
谢谢您,
SPI_close(masterSpi0);
关闭一个,另外一个可以使用了,
,
YiKai Chen:
可以用就好,不客氣
,
desheng li:
谢谢您的帮助
,
desheng li:
您好,两个spi,和DMA的关系大么,dma如何设置
,
YiKai Chen:
spi預設會使用dma,你可以參考 https://dev.ti.com/tirex/explore/node?node=AOng5xFsavzvQ16.KytQHg__eCfARaV__LATEST 跟 https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/604406/ccs-cc1310-is-cc1310-s-spi-already-using-dma-transmission 這個討論串
,
desheng li:
您好,spi使用中,可以不用DMA?如何关掉DMA配置
,
YiKai Chen:
目前ti應該沒有提供关掉DMA配置的spi driver,你為什麼需要關掉呢?
,
desheng li:
#define CC1310_LAUNCHXL_SPI1_MISO IOID_5 /* RF1.20 */ //sensor#define CC1310_LAUNCHXL_SPI1_MOSI IOID_6 /* RF1.18 */#define CC1310_LAUNCHXL_SPI1_CLK IOID_10 /* RF1.16 */#define CC1310_LAUNCHXL_SPI1_CSN IOID_4#define CC1310_LAUNCHXL_SPI0_MISO IOID_14 //sd#define CC1310_LAUNCHXL_SPI0_MOSI IOID_15#define CC1310_LAUNCHXL_SPI0_CLK IOID_10#define CC1310_LAUNCHXL_SPI0_CSN IOID_11
使用两个spi,无法同时使用,关闭一个,另外一个才可以使用
,
YiKai Chen:
之前不是有給你可以成功SPI_open的範例程序?
,
desheng li:
之前,我是关掉一个,在打开另一个的,现在想同时使用,不关掉也可以使用,
,
YiKai Chen:
你是說你還是不能同時SPI_open兩个spi?
,
desheng li:
是的,用您的程序,一个可以打开,另一个就打不开了
,
desheng li:
,
YiKai Chen:
我剛剛又試了一次是沒問題的啊,你可以把你的mainThread完整程序貼上來給我看看嗎?
,
desheng li:
void *mainThread(void *arg0){ SPI_Handle masterSpi0; SPI_Params spiParams0; SPI_Handle masterSpi; SPI_Params spiParams; SPI_init(); /* Open SPI as master (default) */ SPI_Params_init(&spiParams0); spiParams0.frameFormat = SPI_POL0_PHA1; spiParams0.bitRate = 4000000; masterSpi0 = SPI_open(Board_SPI0, &spiParams0); if (masterSpi0 == NULL) { Display_printf(display, 0, 0, "Error initializing master SPI 0\n"); while (1); } else { Display_printf(display, 0, 0, "Master SPI 0 initialized\n"); }// SPI_close(masterSpi0);//// GPIO_write(CC1310_LAUNCHXL_SPI0_CSN,0);// GPIO_write(CC1310_LAUNCHXL_SPI1_CSN,1); SPI_Params_init(&spiParams); spiParams.frameFormat = SPI_POL0_PHA1; spiParams.bitRate = 4000000; masterSpi = SPI_open(Board_SPI1, &spiParams); if (masterSpi == NULL) { Display_printf(display, 0, 0, "Error initializing master SPI\n"); while (1); } else { Display_printf(display, 0, 0, "Master SPI initialized\n"); }}
和您的一样的程序,只是在
#define CC1310_LAUNCHXL_SPI1_MISO IOID_5 /* RF1.20 */ //sensor#define CC1310_LAUNCHXL_SPI1_MOSI IOID_6 /* RF1.18 */#define CC1310_LAUNCHXL_SPI1_CLK IOID_10 /* RF1.16 */#define CC1310_LAUNCHXL_SPI1_CSN IOID_4#define CC1310_LAUNCHXL_SPI0_MISO IOID_14 //sd#define CC1310_LAUNCHXL_SPI0_MOSI IOID_15#define CC1310_LAUNCHXL_SPI0_CLK IOID_10#define CC1310_LAUNCHXL_SPI0_CSN IOID_11
我把两个spi的引脚配置改成这样,其他的没做修改了
,
desheng li:
unsigned char SPIreceiveByte(){ uint8_t n=8; // uint8_t tdata; uint8_t MISO; GPIO_write(CC1310_LAUNCHXL_SPI1_CLK,1); GPIO_write(CC1310_LAUNCHXL_SPI1_CSN,0); while(n–) { CPUdelay(16); GPIO_write(CC1310_LAUNCHXL_SPI1_CLK,0); //时钟为低电平时, CPUdelay(16); tdata = tdata<<1; MISO = GPIO_read(CC1310_LAUNCHXL_SPI1_MISO); if(MISO == 1) tdata = tdata|0x01; //接收位为1,数据最后一位为1 else tdata = tdata&0xfe; GPIO_write(CC1310_LAUNCHXL_SPI1_CLK,1); } GPIO_write(CC1310_LAUNCHXL_SPI1_CSN,1); return(tdata);}
您好,io口可以这样模拟spi通讯么
,
YiKai Chen:
我用下面的腳位配置是可以的,你要不要試試
#define CC1310_LAUNCHXL_SPI0_MISOIOID_5/* RF1.20 */ #define CC1310_LAUNCHXL_SPI0_MOSIIOID_6/* RF1.18 */ #define CC1310_LAUNCHXL_SPI0_CLKIOID_10/* RF1.16 */ #define CC1310_LAUNCHXL_SPI0_CSNIOID_4 #define CC1310_LAUNCHXL_SPI1_MISOIOID_2 #define CC1310_LAUNCHXL_SPI1_MOSIIOID_3 #define CC1310_LAUNCHXL_SPI1_CLKIOID_19 #define CC1310_LAUNCHXL_SPI1_CSNIOID_18/* UART Board */ #define CC1310_LAUNCHXL_UART_RXPIN_UNASSIGNED/* RXD */ #define CC1310_LAUNCHXL_UART_TXPIN_UNASSIGNED/* TXD */ #define CC1310_LAUNCHXL_UART_CTSPIN_UNASSIGNED/* CTS */ #define CC1310_LAUNCHXL_UART_RTSPIN_UNASSIGNED/* RTS */
,
desheng li:
这样是可以打开的,硬件已经做好了,只能修改软件部分
,
YiKai Chen:
你的CC1310_LAUNCHXL_SPI1_CLK和CC1310_LAUNCHXL_SPI0_CLK要用不同腳位啊,不能共用IOID_10
,
desheng li:
已经用了,板子做好了,用IO口模拟spi,不通过DMA
,
YiKai Chen:
如果要共用CLK,那基本上應該是連MOSI/MISO都要共用,只有不同的spi slave的CS接到不同腳位
,
desheng li:
现在没办法改硬件了,现在需要修改程序,用IO口模拟spi通讯,不通过DMA
,
YiKai Chen:
那你保重