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 = 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 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.youkuaiyun.com/20161201214236768)

在实现SPI通信的过程中,遇到的问题:
1、硬件上,一定要确认好连接通了,连接对了,MISO与MISO连接
2、一开始以为从设备也要设置波特率,一直找不到怎么设置,其实从设备的波特率有主设备决定
3、把波特率调到9600做实验,会好些

后记:现在看起来,这玩意虽然很简单,不过的确是我搞通的一次信息传输,所以值得纪念。接下里,还有更多的功能要去探究和学习,从浅到深,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云上笛暮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值