CC3200 与 CC2530的SPI通信
来源:互联网 发布:紫金桥实时数据库 编辑:程序博客网 时间:2024/06/08 19:19
目的:实现CC2530作为master,CC3200作为slave的SPI 通信
连接图如下
/*——————————————————————————–
Master Slave
————- ————-
| | | |
|P1_4 SSN |———>|SSN 8|
| | | |
|P1_5 SCK |———>|SCK 5|
| | | |
|P1_6 MOSI|———>|MOSI 7|
| | | |
|P1_7 MISO|<———|MISO 6|
| | | |
—-CC2530——— ——CC3200——-
硬件连接图:
过程:
CC2530方面:
基本的SPI初始化:
void init_port(void){ IO_FUNC_PORT_PIN(1, 0, IO_FUNC_GIO); //将P1_0设置为普通的IO口 IO_DIR_PORT_PIN(1, 0, IO_OUT); //设置为输出 IO_FUNC_PORT_PIN(1, 1, IO_FUNC_GIO); //将P1_1设置为普通的IO口 IO_DIR_PORT_PIN(1, 1, IO_OUT); //设置为输出 PERCFG |= 0x02; // PERCFG.U1CFG = 1 P1SEL |= 0xE0; // P1_7, P1_6, and P1_5 are peripherals P1SEL &= ~0x10; // P1_4 is GPIO (SSN) P1DIR |= 0x10; // SSN is set as output
主要看时间相位,极性,MSB first or LSB first,波特率的设置。作为主设备,要为从设备提供时钟,而且决定了从设备的波特率
void init_Baudrate(void){ // Set baud rate to max (system clock frequency / 8) // Assuming a 26 MHz crystal (CC1110Fx/CC2510Fx), // max baud rate = 26 MHz / 8 = 3.25 MHz. //U1BAUD = 0x00; // BAUD_M = 0 //U1GCR |= 0x11; // BAUD_E = 17 U1BAUD = 0x3B; // BAUD_M = 59 9600 F=32M U1GCR |= 0x08; // BAUD_E = 8}
这里CC2530的晶振是选择了32M的,波特率设为9600,关于波特率的设置,可以查看用户手册。
下面分析主函数
void main(void){ halMcuInit(); // 选择32MHz晶体振荡器作为系统时钟源(主时钟源)//设置时钟源32MHZ init_port(); //初始化端口 init_Baudrate(); //初始化波特率 // SPI Master Mode U1CSR &= ~0xA0; //选择为SPI为Master **//注意相位,极性,和MSB的设置,因为在从设备上要设置为一样的。** // Configure phase, polarity, and bit order U1GCR &= ~0xC0; // CPOL = CPHA = 0 SHANG SHENG YAN CAI YANG U1GCR |= 0x20; // ORDER = 1 MSB first LED1=0; unsigned char i; char txBufferMaster[]="hello world"; while(1) { for (i = 0; i <= sizeof(txBufferMaster); i++) { SSN = LOW; U1DBUF = txBufferMaster[i]; //加入要发送的数据 while (!U1TX_BYTE); SSN = HIGH; U1TX_BYTE = 0; } LED1=~LED1; halMcuWaitMs(1000); }}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
下面分析从设备的设置
主要就是SPI的初始化要与主设备相匹配,然后在接受到数据之后,通过串口打印出来,已验证是否接受成功。
//*****************************************************************************void SlaveMain(){ // // Initialize the message // memcpy(g_ucTxBuff,SLAVE_MSG,sizeof(SLAVE_MSG)); // // Set Tx buffer index // ucTxBuffNdx = 0; ucRxBuffNdx = 0; // // Reset SPI // MAP_SPIReset(GSPI_BASE); // // Configure SPI interface // /* MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI), SPI_IF_BIT_RATE,SPI_MODE_SLAVE,SPI_SUB_MODE_0, (SPI_HW_CTRL_CS | SPI_4PIN_MODE | SPI_TURBO_OFF | SPI_CS_ACTIVEHIGH | SPI_WL_8)); */ //注意,片选为软件控制SPI_SW_CTRL_CS,低电平有效SPI_CS_ACTIVELOW,且CC3200的spi为MSB firstMAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI), SPI_IF_BIT_RATE,SPI_MODE_SLAVE,SPI_SUB_MODE_0, (SPI_SW_CTRL_CS | SPI_4PIN_MODE | SPI_TURBO_OFF | SPI_CS_ACTIVELOW | SPI_WL_8)); // // Register Interrupt Handler // MAP_SPIIntRegister(GSPI_BASE,SlaveIntHandler); // // Enable Interrupts // MAP_SPIIntEnable(GSPI_BASE,SPI_INT_RX_FULL|SPI_INT_TX_EMPTY); // // Enable SPI for communication // MAP_SPIEnable(GSPI_BASE); // // Print mode on uart // Message("Enabled SPI Interface in Slave Mode\n\rReceived : ");}//*****************************************************************************在从设备中,采用中断方式,当接受寄存器满了之后,就将数据读取,并通过串口打印出来。
//*******************************************************************
//
//! SPI Slave Interrupt handler
//!
//! This function is invoked when SPI slave has its receive register full or
//! transmit register empty.
//!
//! \return None.
//
//*******************************************************************
static void SlaveIntHandler()
{
unsigned long ulRecvData;
unsigned long ulStatus;
ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);MAP_SPIIntClear(GSPI_BASE,SPI_INT_RX_FULL|SPI_INT_TX_EMPTY);/*if(ulStatus & SPI_INT_TX_EMPTY){ MAP_SPIDataPut(GSPI_BASE,g_ucTxBuff[ucTxBuffNdx%TR_BUFF_SIZE]); ucTxBuffNdx++;}*/if(ulStatus & SPI_INT_RX_FULL){ MAP_SPIDataGetNonBlocking(GSPI_BASE,&ulRecvData); g_ucTxBuff[ucRxBuffNdx%TR_BUFF_SIZE] = ulRecvData; Report("%c",ulRecvData); ucRxBuffNdx++;}
}
//*******************************************************************
至此,基本实现了二者的通信。![传送:hello world](http://img.blog.csdn.net/20161201214236768)
在实现SPI通信的过程中,遇到的问题:
1、硬件上,一定要确认好连接通了,连接对了,MISO与MISO连接
2、一开始以为从设备也要设置波特率,一直找不到怎么设置,其实从设备的波特率有主设备决定
3、把波特率调到9600做实验,会好些
后记:现在看起来,这玩意虽然很简单,不过的确是我搞通的一次信息传输,所以值得纪念。接下里,还有更多的功能要去探究和学习,从浅到深,加油!
- CC3200 与 CC2530的SPI通信
- 基于CC2530的SPI通信调试笔记
- CC2530 的SPI通信中的问题和解决方法
- STM32 spi与FPGA的通信
- s5pv210与stm32 spi通信
- ARM与射频芯片TRF796x的SPI通信研究
- ARM与射频芯片TRF796x的SPI通信研究
- S3C2410与指纹传感器MBF200的SPI通信
- 基于STM32与NOR FLASH的SPI通信
- AT917S256 的SPI通信实现
- SPI通信速度的优化!
- aduc841单片机的SPI通信
- Raspberry pi通过SPI与FPGA通信
- STM32与FPGA通过SPI通信
- 树莓派使用SPI与一片flask通信
- Pixy(Cmucam5)通过SPI与Arduino通信
- CC2530 芯片的UART转485通信的实现
- SPI通信
- WCF
- Unix下共有五种I/O模型
- github搜索技巧
- mfc textout输出字体设置
- Gradle执行顺序
- CC3200 与 CC2530的SPI通信
- 设计模式与7大原则
- JSP技术
- sendto、WSASendto,recvfrom、WSARecvfrom 区别?
- webcollector 初探(一)
- Android中Fragment生命周期详解
- Segment 快速乘(二进制模拟乘)类似于快速
- Android Theme的使用
- 使用IDEA进行Spark开发(二)-第一个scala程序