CC2541蓝牙开发

CC2541蓝牙开发无评论

2017年7月28日 at 下午12:06分类:硬件 阅读: 138 次

1、如何查看程序大小
在project项目的编译目录list下有一个map文件:

在此map文件最后有占用程序空间和RAM空间的信息:

CC2541的FLASH有128K和256K两种,RAM大小为8K

2、CC2541的低功耗模式

空闲模式:sleepcmd.mode=0,PCON=1进入此模式,停止CPU 内核活动,此模式将被任何使能的中断唤醒

PM1:sleepcmd.mode=1,PCON=1进入此模式,32M变为32K晶振,数字核心正常,CPU停止执行,复位、外部中断或睡眠定时器过期将转为正常模式

PM2:sleepcmd.mode=2,PCON=1进入此模式,数字核心模块关闭,复位、外部中断或睡眠定时器过期将转为正常模式

PM3:sleepcmd.mode=3,PCON=1进入此模式,晶振关闭,数字核心模块关闭,复位、外部中断过期将转为正常模式

进入低功耗模式后,I/O 引脚保留进入之前设置的I/O 模式和输出值。

所有低功耗模式的CPU内核执行都是停止的

3、ADC

p0口管脚可以作为ADC,ADC参考电压为1.25v,参考电压对应采样的最大值,比如10位采样,最大值为511,511时就为1.25v

可以对供电电压进行采样,缺省是对供电电压的1/3进行采样,因此最大支持1.25*3=3.75v电压采样

片内的温度传感器也可以用adc采样输出
//显示VDD电压
{
HalAdcSetReference( HAL_ADC_REF_125V );
adc = HalAdcRead( HAL_ADC_CHANNEL_VDD, HAL_ADC_RESOLUTION_10 );
vdd=adc*1.25*3/511;
sprintf(str, "vdd=%.3f", vdd);
HalLcdWriteString( str, HAL_LCD_LINE_5 );
}

//显示温度
{
#define TEMP_CONST 0.61065 // (1250 / 2047)
#define TEMP_OFFSET_DATASHEET 750
#define TEMP_OFFSET_MEASURED_AT_25_DEGREES_CELCIUS 29.75
#define TEMP_OFFSET (TEMP_OFFSET_DATASHEET + TEMP_OFFSET_MEASURED_AT_25_DEGREES_CELCIUS) // 779.75
#define TEMP_COEFF 4.5
float AvgTemp;
float AvgTemp_sum = 0;
TR0 = 0x01; //设置为1来连接温度传感器到SOC_ADC
ATEST = 0x01; //使能温度传感
// 求64个平均值,以便稳定
for(int i = 0; i<64; i++) { HalAdcSetReference( HAL_ADC_REF_125V ); adc = HalAdcRead( HAL_ADC_CHN_TEMP, HAL_ADC_RESOLUTION_12 ); AvgTemp = adc * TEMP_CONST; AvgTemp = ((AvgTemp - TEMP_OFFSET) / TEMP_COEFF); AvgTemp_sum += AvgTemp; } // 得到实际温度 AvgTemp = AvgTemp_sum/64; TR0 &= ~0x01; ATEST &= ~0x01; sprintf(str, "temp=%.3f", AvgTemp); HalLcdWriteString( str, HAL_LCD_LINE_6 ); }

 

4、开关蓝牙广播
uint8 current_adv_enabled_status;
uint8 new_adv_enabled_status;
//获取当前GAP广播状态
GAPRole_GetParameter( GAPROLE_ADVERT_ENABLED, ¤t_adv_enabled_status );
//切换广播开关状态
if( current_adv_enabled_status == FALSE )
{
new_adv_enabled_status = TRUE;
}
else
{
new_adv_enabled_status = FALSE;
}
//设置蓝牙广播开关
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &new_adv_enabled_status );

5、BLE连接过程

启动后,蓝牙设备开始处于广播状态,如果DEFAULT_DISCOVERABLE_MODE设置为GAP_ADTYPE_FLAGS_LIMITED状态,则广播180秒后停止(可用GAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT, 60)重新设置时超时间),如果设置为GAP_ADTYPE_FLAGS_GENERAL则一直广播。
连接成功后,从设备广播停止。
BLE主设备每次必须通过从设备广播才能连接,这表示一个从设备只能同时和一个主设备建立连接。

广播包中包含:发现模式(是否为受限广播,是否支持BR/EDR)、服务UUID等
扫描响应包含:从机名称、连接时间参数、发射功率(CC2541支持3种发射功率:0dB(default)、-6dB、-23dB,此发射功率只是发给主机看看而已的,并不起配置作用,实际设置用HCI_EXT_SetTxPowerCmd函数)

主设备扫描,从设备回复扫描响应数据scanRspData,主设备发起连接请求,建立连接。

BLE建立连接后,才进行配对和绑定过程。
连接后,如果要进行配对,必须将主机或从机某一方的配对模式GAPBOND_PAIRING_MODE设置为GAPBOND_PAIRING_MODE_INITIATE

other:protel中PCB测距

ctrl+M开始测距,点击起始,再点击终止位置,会显示距离

三极管开关电路

三极管开关电路无评论

2017年7月27日 at 下午5:08分类:硬件 阅读: 135 次

一般的三极管开关电路如下:

a电路,开通时假设为高电平5V,基极电流Ib=(5V-0.7V)/4.7K=0.9mA,可以使三极管完全饱和。b 电路用的是PNP管,同样把蜂鸣器接在三极管的集电极,不同的是驱动信号是5V的TTL电平。以上这两个都可以正常工作,只要PWM驱动信号工作在合适的频率,蜂鸣器(有源)都会发出最大的声音。


上图在基极与发射极之间多加了一个100K的电阻,这个电阻也是有一定作用的,可以让三极管有一个已知的默认状态。当输入信号去除的时候,三极管还处于关断状态。在安全和稳定的方面考虑,多加的这个电阻还是很有必要的,或者说可以让三极管工作在更好的开关状态。

器件封装0805、0603

器件封装0805、0603无评论

2017年7月27日 at 下午12:15分类:硬件 阅读: 129 次

0805代表0.08英寸x0.05英寸,而1英寸=25.4毫米

1206
L:0.12inch(3.2mm)W:0.06inch(1.6mm)

0805
L:0.08inch(2.0mm)W:0.05inch(1.25mm)

0603
L:0.06inch(1.6mm)W:0.03inch(0.8mm)

0402
L:0.04inch(1.0mm)W:0.02inch(0.5mm)

CSR8670开发(3)-按键输入

CSR8670开发(3)-按键输入无评论

2017年7月20日 at 上午10:48分类:硬件 阅读: 159 次

开发板上的按键缺省都指定了功能,比如播放、音量、选曲控制等等
按键定义:
先将PIO口的物理按键映射成逻辑按键

上图显示PIO1口的物理按键指定为逻辑按键1
然后为逻辑按键指定相应的事件:

上图显示逻辑按键1指定为音量减少功能

要修改按钮功能,可以修改sink_buttons.c文件
修改函数ButtonsMessageHandler

在MESSAGE_PIO_CHANGED分支中是PIO口的状态变化事件,在此分支中判断按键
if (lMessage1->state & 1)
根据按键来添加相应的功能

CSR8670开发(2)-led、蜂鸣器、振动器控制

CSR8670开发(2)-led、蜂鸣器、振动器控制无评论

2017年7月18日 at 下午9:48分类:硬件 阅读: 171 次

1、用bluelab打开sink工程
2、修改main.c文件


    在main()函数前增加

    #define MYLED (1 << 10) /* bit 10 */
    #define MYDELAY 500 /* ms */
    static void myled_controller( Task t, MessageId id, Message payload )
    {
    PioSet32( MYLED, (PioGet32() ^ MYLED) );//PIO10电平反转
    MessageSendLater( t, 0, 0, MYDELAY ); //设置延时
    }
    static TaskData myled_controller_task = { myled_controller };

    设置PIO10闪烁
    在main()函数中增加:
    PioSetDir32(MYLED, MYLED); //设置PIO10为输出
    PioSet32(MYLED, MYLED); //初始化PIO10为高电平
    MessageSend( &myled_controller_task, 0 , 0 );

    重新编译、运行程序,PIO10连接的指示灯会闪烁

    将上面的PIO10改成PIO14,延时改为1ms,就可以驱动蜂鸣器发出500Hz的声音

    改成PIO15,可以驱动振动器动作

    注意,当PIO被系统配置占用的时候,如果用PioSet32设置PIO的数值,会导致设置语句执行失败,比如PIO6被系统占用:

    此时用语句:
    PioSet32( (1<<11)|(1<<10)|(1<<7)|(1<<6)|(1<<5), itemp); 会导致整条语句执行失败