如何使用 CC2540 制作一个 iBeacon

如何使用 CC2540 制作一个 iBeacon,第1张

准备工作

一台 PC

IAR Embedded Workbench 集成开发环境,可以用30天试用版本。

支持 蓝牙 4.0 的智能手机一部,并安装下列应用之一

Android Google Play Store.

iPhone App Store.

CC2540 开发板

CCDebugger 下载器

创建 iBeacon 工程文档

安装 TI 官方的 CC254x 开发环境

复制 C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\SimpleBLEBroadcaster 文件夹

粘贴到:C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\iBeacon

运行 IAR Embedded Workbench,点击 File >Open >Workspace

修改源代码

simpleBLEBroadcaster.c

// GAP - Advertisement data (max size = 31 bytes, though this is

// best kept short to conserve power while advertisting)

static uint8 advertData[] =

{

// Flagsthis sets the device to use limited discoverable

// mode (advertises for 30 seconds at a time) instead of general

// discoverable mode (advertises indefinitely)

0x02, // length of this data

GAP_ADTYPE_FLAGS,

GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,

// three-byte broadcast of the data "1 2 3"

0x04, // length of this data including the data type byte

GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type

1,

2,

3

}

修改下面关键字

UID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0

Major: 1 (0x0001)

Minor: 1 (0x0001)

Measured Power: -59 (0xc5)

// GAP - Advertisement data (max size = 31 bytes, though this is

// best kept short to conserve power while advertisting)

static uint8 advertData[] =

{

// 25 byte ibeacon advertising data

// Preamble: 0x4c000215

// UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0

// Major: 1 (0x0001)

// Minor: 1 (0x0001)

// Measured Power: -59 (0xc5)

0x1A, // length of this data including the data type byte

GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type

0x4c,

0x00,

0x02,

0x15,

0xe2,

0xc5,

0x6d,

0xb5,

0xdf,

0xfb,

0x48,

0xd2,

0xb0,

0x60,

0xd0,

0xf5,

0xa7,

0x10,

0x96,

0xe0,

0x00,

0x01,

0x00,

0x01,

0xc5

}

接下来修改广播类型,将下面代码

//uint8 advType = GAP_ADTYPE_ADV_NONCONN_IND// use non-connectable advertisements

uint8 advType = GAP_ADTYPE_ADV_DISCOVER_IND// use scannable unidirected advertisements

修改为

uint8 advType = GAP_ADTYPE_ADV_NONCONN_IND // use non-connectable advertisements

//uint8 advType = GAP_ADTYPE_ADV_DISCOVER_IND// use scannable unidirected advertisements

接下来修改 GAP

// Set the GAP Role Parameters

GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable )

GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime )

GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData )

GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData )

GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType )

因为 iBeacon 必须不间断广播,并且不响应任何数据请求,所以我们要修改 GAPROLE_ADVERT_OFF_TIME 和 GAPROLE_SCAN_RSP_DATA。

// Set the GAP Role Parameters

GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable )

//GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime )

//GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData )

GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData )

GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType )

保存工程后,进行编译,并通过 CCDebugger 下载程序到开发板中。

Select Project >Clean to clean the project.

Select Project >Make to make the project.

Select Project >Download and Debug to send the code to the CC2540 Key Fob

Select Debug >Go to Run the code on the CC2540 Key Fob.

BLE iBeacon

TI Displayport ESD Protection – TPD8S009

Arduino SPI 精华课程

TAGS

Arduino Arduino Due Arduino Esplora Atmega32u4 Atmel BacklightBMP085 Bootloader CC3x00 DatasheetDisplayport EasyDriver EDID eDPEsplora HDMI HMC5883L I2CJoystick LCD LED Luban LVDS MIPIMPU6050 MySQL Nginx PCB PHP pinModePWM PX4 Raspberry Pi RGB Sensor SPIStepper Motor Ubuntu Wifi 摇杆 树莓派步进电机 电源 背光 蓝牙

CATEGORIES

3D Printer

Android

Application Notes

Arduino

AVR

Backlight Driver

C

CC3x00

Datasheet

Development Environment

HDMI

Imaging &Graphics

iOS

Javascript

LCD/LCM

Material

Others

PCB Design

Power Management

Prototyping

Raspberry Pi

Rostock

Sensor

Server

Software

STM32

Super Manual

Tutorials

Work

1.串口轮询部分。通过如下代码调串口回调函数。if (cnt >= HAL_UART_DMA_FULL){evt = HAL_UART_RX_FULL}else if (cnt >= HAL_UART_DMA_HIGH){evt = HAL_UART_RX_ABOUT_FULLPxOUT |= HAL_UART_Px_RTS}else if (cnt &&!dmaCfg.rxTick){evt = HAL_UART_RX_TIMEOUT但是我们希望当收到一条指令,大概8~10个字节,接收完就调回调函数。如果设置if (cnt >= 8){evt = HAL_UART_RX_IND}则会出现DMA未接收完就调用回调函数的情况,则会出现接收错误。如果将cnt>24,则势必会在缓冲区堵塞一条指令。想问一下,如何判断DMA串口接收完成?我理解的是根据DMAIRQ寄存器中,DMAIF的状态位来判断,但硬件调试的过程中,一直没发现变为1的情况,所以,无法用来判断接收完成。2.程序中,电源电压检测部分,BattMeasure函数中,HalAdcSetReference( HAL_ADC_REF_125V )adc = HalAdcRead( HAL_ADC_CHANNEL_VDD, HAL_ADC_RESOLUTION_10 )adc测量的数,换算成电压值后,和用稳压电源输出的电压值(搭配着万用表测量电压),有大致0.1V的误差,当电压逼近2.0V时,误差会减小。很想问一下,这是什么原因?是CC2540adc检测过程中不可避免的误差还是什么原因造成的?如果恒定误差有0.1V的话,在程序中电量检测部分,可以做出调整,否则低电量报警也会导致误差。希望能有一个官方的说法。非常希望技术支持给予答复,非常感谢您的帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7865311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存