CC3200 与 CC2530的SPI通信
目的:实现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 = 17U1BAUD = 0x3B; // BAUD_M = 59 9600 F=32MU1GCR |= 0x08; // BAUD_E = 8
}
这里CC2530的晶振是选择了32M的,波特率设为9600,关于波特率的设置,可以查看用户手册。
下面分析主函数
void main(void)
{halMcuInit(); // 选择32MHz晶体振荡器作为系统时钟源(主时钟源)//设置时钟源32MHZinit_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 YANGU1GCR |= 0x20; // ORDER = 1 MSB firstLED1=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 first
MAP_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](https://img-blog.csdn.net/20161201214236768)
在实现SPI通信的过程中,遇到的问题:
1、硬件上,一定要确认好连接通了,连接对了,MISO与MISO连接
2、一开始以为从设备也要设置波特率,一直找不到怎么设置,其实从设备的波特率有主设备决定
3、把波特率调到9600做实验,会好些
后记:现在看起来,这玩意虽然很简单,不过的确是我搞通的一次信息传输,所以值得纪念。接下里,还有更多的功能要去探究和学习,从浅到深,加油!
CC3200 与 CC2530的SPI通信相关推荐
- Zigbee(cc2530)和STM32 SPI通信,温度采集,组网
实验板子: 1. zigbee底板3块(1终端.1路由.1协调器,均基于CC2530) 2. stm32核心板(采集温度) 说明:下面的程序都是在TI官方例程SampleApp工程下面进行的更改.Z- ...
- STM32 SPI通信(读写flash)
SPI通信 四线制 MISO:主设备数据输入,从设备数据输出 MOSI:主设备数据输出,从设备数据输入 SCLK:时钟信号 CS:片选引脚(低电平有效) 时序图 读写程序 flash读写函数: u8 ...
- android spi串口调试,PIC入门3,SPI通信和串口调试实验
原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...
- TLE5012B ESP32驱动程序、硬件电路设计、4线SPI通信,驱动完美兼容4线SPI不用改MOSI开漏推挽输出
一.TLE5012B 简介 TLE5012B 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行角度测量. 它通过使用单片集成 巨磁阻 (iGMR) 元件,来测量正弦和余弦角分量,这些原 ...
- AS5047P磁编码器ESP32驱动程序、硬件电路设计、SPI通信时序、逻辑波形分析、注意事项
1.AS5047P硬件设计 1.1 简介.性能参数 AS5047P 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行高速(高达 28krpm)角度测量.这种新型位置传感器配备了革命性的 ...
- SPI通信实验---verilog(FPGA作为从机,使用可读可写)
文章原地址: http://www.cnblogs.com/fhyfhy/p/4429302.html SPI通信实验---verilog(FPGA作为从机,使用可读可写) 本实验讲究实用性,故设计思 ...
- stm32f405rgt6与as5048a的SPI通信问题
与as5048a的SPI通信问题 本人最近在学习无刷直流电机的FOC,其中用了一个带有磁编码器as5048a作为角度反馈的电机,其中pwm接口输出是正常的,但是在SPI通信的时候出现了问题.研究了几天 ...
- ADI官方解释在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)
串行外设接口(SPI)是微控制器和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以 ...
- 通信协议整理之 SPI 通信
通信协议整理之 SPI 通信 文章目录 通信协议整理之 SPI 通信 简介 工作原理 通信连接方式 补充 硬件 SPI 和模拟 SPI 简介 SPI是串行外设接口(Serial Peripheral ...
最新文章
- php中instanceof的使用
- Hadoop综合大作业补交4次作业:获取全部校园新闻,网络爬虫基础练习,中文词频统计,熟悉常用的Linux操作...
- 使用VS Code开发调试.NET Core 2.0
- 力扣(LeetCode):字符串转换整数 (atoi)
- “炉石”以上,“万智”未满《符文之地传奇》为何能有好开局?
- 呃... 写满数据的硬盘是否比空硬盘重?
- [kuangbin]专题12 基础DP
- MYSQL相关学习-常用语句
- 可输入可选择的input
- JQuery ajax 在aspx中传值和取值
- 河里的水哪里去了——兼谈气候变暖与西方文明
- 51单片机汇编学习例程(6)——74HC573数码管篇
- 【数据结构与算法】之深入解析“香槟塔”的求解思路与算法示例
- 快速云:IDC、EDC、ODC、DC分别指什么机房?
- Shiro session过期跳转到登录页面问题
- 牛客--2019网易--扭蛋机
- MySql 数据库 管理员密码忘记怎么办?
- 第十二届蓝桥杯 2021年省赛真题 (Java 大学A组) 第一场
- 实战iOS应用从32位升级到64位
- 垃圾收集之Remember Set(CardTable)