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架构后接着需要做些小功能啦,既然后面要做广告机,这几天就从网络获取数据。希望和大家一起成长。