【测评报告 H】 - CC3200-LAUNCHXL 开发板测评报告 ——开箱测评02

CC3200学习

1.开机测试

拿到板子已经几天了,这几天也在逐步了解CC3200,拿到板子后,开机上电是有个例程的

  

通过短接黑框的跳线帽,设置WIFI为AP模式,然后手机连接wifi,

然后打开手机浏览器,输入http://MySimpleLink.net,即可进入板载网页。

 

其实学习一款一款芯片,都是从官网资料开始的,所以我们应该学会阅读英文资料,首先我们从官网下载CC3200的SDK,然后安装,在其SDK中已经有一套完整的资料了,

 

1.内部结构

打开docs目录下的CC3200-Programmers_Guide.pdf文档,这篇文档主要用来概述CC3200的一些资源以及编程时如何构建环境,对于CC3200芯片的更多细节需要查看SWAS032文档,文档中详细介绍了器件的特性,有助于作为前期选型时的一个参考。

从框图中可以看出,CC3200芯片内部事实上含有两个处理器,其中一个是专用Network处理器,这个所谓的Network处理器就是TI前一代产品CC3100,其本质也是一个专用ARM处理器;另外一个便是Cortex-M4处理器,用于提供外设接口。

2. CC3200的功能框图

另一个非常重要的便是CC3200的功能框图。之所以说这个图重要,是因为图中可以清楚地看到CC3200工作的模式流程,而且对于硬件电路设计起到了很好的参考作用,比如:右下方的时钟源部分,可以看到在下载程序时必须提供外部的32K的时钟源作为Digital Power-On Reset功能。

通过这些,再结合事例代码,即可很快入门。

3对比分析

接下来将CC3200与HF-LPB100、ESP8266对比

芯片型号

CC3200

乐鑫ESP8266

HFLPB100

频段

2.4G

2.4G

2.4G

系统

FreeRTOS

FreeRTOS

FreeRTOS

SDK是否开源

提供SDK

最大内存

64KB

50KB

128KB/512KB

功耗

TX:229mARX:59m

TX:140mARX:56mA

28mA/90MA

主频

80MHZ

80MHZ/160MHZ

48MHZ

价格

28

8

模组27

通过以上对比

(1)     再价格方面,ESP8266优势巨大,而CC3200价格较贵,HFLPB100只卖模组。

(2)     性能方面:ESP8266性能较弱,跑不了太复杂的任务,CC3200因为Wi-Fi网络处理器(CC3200)包含一个Wi-Fi片上互联网和一个可完全免除应用MCU处理负担的专用ARMMCU,因此性能较强。

(3)     开发难度,由于CC3200生态系统较强,提供了许多事例代码,对入门学习比较方便,适合想深入了解WIFI的人,且其Sock方式兼容Linux的Sock。ESP8266有许多开源项目,但整个系统太庞大,基础不好的同学一开始接触回比较晕。而HFLPB100由于公司是直接用HF的固件,因此没去玩过他的SDK。

总结:其实公司一般都是用模组的,因为重新开发的话会增加成本。我们都是直接通过串口发送AT指令来控制WIFI模块。但我们一定要了解一款WIFI模块,并从底层,一步步的往上摸,从硬件到Sock,到应用。

       在嵌入式网络编程学习这里,推荐CC3200,因为它的操作方式和Linux兼容,当然ESP32或8266也行。下面我贴些CC3200的Sock代码出来。

4 .TCP Server与Client代码分析

int BsdTcpClient(unsigned short usPort)

{

    //filling the TCP server socket address

    sAddr.sin_family = SL_AF_INET;

    sAddr.sin_port = sl_Htons((unsigned short)usPort);

    sAddr.sin_addr.s_addr = sl_Htonl((unsigned int)g_ulDestinationIp);

    // creating a TCP socket

    iSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);

    // connecting to TCP server

    iStatus = sl_Connect(iSockID, ( SlSockAddr_t *)&sAddr, iAddrSize);

    // sending multiple packets to the TCP server

    while (lLoopCount < g_ulPacketCount)

    {

        // sending packet

        iStatus = sl_Send(iSockID, g_cBsdBuf, sTestBufLen, 0 );

        if( iStatus < 0 )

        {

            // error

            sl_Close(iSockID);

            ASSERT_ON_ERROR(SEND_ERROR);

        }

        lLoopCount++;

    }

    iStatus = sl_Close(iSockID);

    //closing the socket after sending 1000 packets

    return SUCCESS;

}

 

int BsdTcpServer(unsigned short usPort)

{

   

    //filling the TCP server socket address

    sLocalAddr.sin_family = SL_AF_INET;

    sLocalAddr.sin_port = sl_Htons((unsigned short)usPort);

    sLocalAddr.sin_addr.s_addr = 0;

 

    // creating a TCP socket

    iSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);

    // binding the TCP socket to the TCP server address

    iStatus = sl_Bind(iSockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize);

    // putting the socket for listening to the incoming TCP connection

    iStatus = sl_Listen(iSockID, 0);

    // setting socket option to make the socket as non blocking

    iStatus = sl_SetSockOpt(iSockID, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &lNonBlocking, sizeof(lNonBlocking));

 

    // waiting for an incoming TCP connection

    while( iNewSockID < 0 )

    {

        // accepts a connection form a TCP client, if there is any

iNewSockID = sl_Accept(iSockID, ( struct SlSockAddr_t *)&sAddr, (SlSocklen_t*)&iAddrSize);

    }

    // waits for 1000 packets from the connected TCP client

    while (lLoopCount < g_ulPacketCount)

    {

        iStatus = sl_Recv(iNewSockID, g_cBsdBuf, iTestBufLen, 0);

        if( iStatus <= 0 )

        {

          // error

          sl_Close(iNewSockID);

          sl_Close(iSockID);

          ASSERT_ON_ERROR(RECV_ERROR);

        }

        lLoopCount++;

    }

    // close the connected socket after receiving from connected TCP client

    iStatus = sl_Close(iNewSockID);   

    return SUCCESS;

}

Client客户端流程如下:

1.     获取套接字句柄,

_i16 sl_Socket(_i16 Domain, _i16 Type, _i16 Protocol);

Domain有三类参数

AF_INET

AF_RF

AF_INET6

Type参数有:

SOCK_STREAM(可靠的面向流的服务或流套接字)

SOCK_DGRAM(数据报服务或数据报套接字)

SOCK_RAW(网络层上的原始协议)

Protocol:一般传入参数0

IPPROTO_TCP

IPPROTO_SCTP

IPPROTO_UDP

IPPROTO_DCCP.

由于CC3200里面有两个核,一个负责WIFI一个负责控制,因此这个Sock的具体实现并没有给出,只给出了库。

对于网络编程详细说明,推荐看unix网络编程

理解了CC3200架构后接着需要做些小功能啦,既然后面要做广告机,这几天就从网络获取数据。希望和大家一起成长。