目的:实现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通信相关推荐

  1. Zigbee(cc2530)和STM32 SPI通信,温度采集,组网

    实验板子: 1. zigbee底板3块(1终端.1路由.1协调器,均基于CC2530) 2. stm32核心板(采集温度) 说明:下面的程序都是在TI官方例程SampleApp工程下面进行的更改.Z- ...

  2. STM32 SPI通信(读写flash)

    SPI通信 四线制 MISO:主设备数据输入,从设备数据输出 MOSI:主设备数据输出,从设备数据输入 SCLK:时钟信号 CS:片选引脚(低电平有效) 时序图 读写程序 flash读写函数: u8 ...

  3. android spi串口调试,PIC入门3,SPI通信和串口调试实验

    原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...

  4. TLE5012B ESP32驱动程序、硬件电路设计、4线SPI通信,驱动完美兼容4线SPI不用改MOSI开漏推挽输出

    一.TLE5012B 简介 TLE5012B 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行角度测量. 它通过使用单片集成 巨磁阻 (iGMR) 元件,来测量正弦和余弦角分量,这些原 ...

  5. AS5047P磁编码器ESP32驱动程序、硬件电路设计、SPI通信时序、逻辑波形分析、注意事项

    1.AS5047P硬件设计 1.1 简介.性能参数 AS5047P 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行高速(高达 28krpm)角度测量.这种新型位置传感器配备了革命性的 ...

  6. SPI通信实验---verilog(FPGA作为从机,使用可读可写)

    文章原地址: http://www.cnblogs.com/fhyfhy/p/4429302.html SPI通信实验---verilog(FPGA作为从机,使用可读可写) 本实验讲究实用性,故设计思 ...

  7. stm32f405rgt6与as5048a的SPI通信问题

    与as5048a的SPI通信问题 本人最近在学习无刷直流电机的FOC,其中用了一个带有磁编码器as5048a作为角度反馈的电机,其中pwm接口输出是正常的,但是在SPI通信的时候出现了问题.研究了几天 ...

  8. ADI官方解释在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)

    串行外设接口(SPI)是微控制器和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以 ...

  9. 通信协议整理之 SPI 通信

    通信协议整理之 SPI 通信 文章目录 通信协议整理之 SPI 通信 简介 工作原理 通信连接方式 补充 硬件 SPI 和模拟 SPI 简介 SPI是串行外设接口(Serial Peripheral ...

最新文章

  1. php中instanceof的使用
  2. Hadoop综合大作业补交4次作业:获取全部校园新闻,网络爬虫基础练习,中文词频统计,熟悉常用的Linux操作...
  3. 使用VS Code开发调试.NET Core 2.0
  4. 力扣(LeetCode):字符串转换整数 (atoi)
  5. “炉石”以上,“万智”未满《符文之地传奇》为何能有好开局?
  6. 呃... 写满数据的硬盘是否比空硬盘重?
  7. [kuangbin]专题12 基础DP
  8. MYSQL相关学习-常用语句
  9. 可输入可选择的input
  10. JQuery ajax 在aspx中传值和取值
  11. 河里的水哪里去了——兼谈气候变暖与西方文明
  12. 51单片机汇编学习例程(6)——74HC573数码管篇
  13. 【数据结构与算法】之深入解析“香槟塔”的求解思路与算法示例
  14. 快速云:IDC、EDC、ODC、DC分别指什么机房?
  15. Shiro session过期跳转到登录页面问题
  16. 牛客--2019网易--扭蛋机
  17. MySql 数据库 管理员密码忘记怎么办?
  18. 第十二届蓝桥杯 2021年省赛真题 (Java 大学A组) 第一场
  19. 实战iOS应用从32位升级到64位
  20. 垃圾收集之Remember Set(CardTable)

热门文章

  1. 华为机器学习服务语音识别功能,让应用绘“声”绘色
  2. 新版微信-微信公众号一键关注解决办法
  3. JAVA+MySQL综合笔记
  4. 微信H5、网页、内置Web浏览器 清理缓存,微信浏览器缓存
  5. app怎么调用mysql数据_教你如何拿别人APP中的数据
  6. 【CSDN英雄会】囯炬CEO张代浩:做写架构的人,做制定游戏规则的人
  7. 2021icpc亚洲赛区沈阳站总结
  8. Windows句柄数限制
  9. 通用vue组件化登录页面
  10. phpExcel导出excel文件浏览器一直不会出现下载框