【AC6921X】_01_基于杰里芯片的BH1415F驱动

一、 前言

本人使用的是杰里的AC6921A蓝牙芯片,用于驱动BH1415F进行87.5MHz~108MHz调频输出,有想要了解这个杰里系列芯片的朋友可以看看以下三个博主的链接。

  1. 此博主主要讲了杰里系列芯片的引脚如何配置模式callmexiaoming
  2. 博主2: JaLLs
  3. 博主3:陈Eighteen

二、BH1415F

2.1芯片介绍

BH1415F是一款广播发射用的单芯片立体声 FM 发射器集成电路。它能够将音频信号转换为 FM 调制信号,并通过天线进行无线传输。以下是该芯片的一些主要特点和功能:

  1. 广播频率范围:BH1415F能够覆盖 76 MHz 至 108 MHz 的 FM 广播频率范围,使其适用于大多数国家和地区的 FM 广播。
  2. 立体声输出: 支持立体声音频输入,可以实现高质量的立体声 FM 广播。
  3. 集成电路设计: 作为单芯片解决方案,BH1415F 集成了广播发射所需的大部分功能,包括调频发射、音频预加重、立体声编码等。
  4. 低功耗: BH1415F 设计用于低功耗应用,可以在电池供电情况下运行。
  5. 晶体振荡器支持: 可以使用外部晶体振荡器来提供精确的频率控制,以确保稳定的广播信号输出。
  6. 低杂散和谐波: BH1415F 设计有良好的抗杂散和谐波性能,可以提供清晰、稳定的广播信号。
  7. 低失真: 在适当的工作条件下,BH1415F 可以提供低失真的音频传输,确保音频质量。
    总体而言,BH1415F 是一款性能稳定、功能丰富的 FM 广播发射器集成电路,适用于各种广播应用,如个人广播、无线音频传输等。
    贴一个芯片手册链接:BH1415F数据手册

2.2芯片内部电路图

翻译可能不准确,可对照英文原版进行查看。
在这里插入图片描述
在这里插入图片描述

三、BH1415F驱动

驱动BH1415F,只需MCU的3个IO口与BH1415FDATA、CLOCK、CE脚相连。
本文是:DATA -> PA5,CLOCK -> PA4, CE ->PA5
其通信协议类似三线制SPI,不过片选高电平有效,上升沿写入数据,数据地位在前。
在这里插入图片描述
更详细的时序图可看这个帖子:数字锁相环调频发射芯片BH1415F的控制时序图

3.1bh1415f.h

#ifndef _BH1415F_H
#define _BH1415F_H

#include "common/common.h"

#define bh1415_delay()  delay(50)

#define bh1415_printf   printf

#define BH1415F_PORT    JL_PORTA
#define CE_PIN          5
#define CLK_PIN         4
#define DA_PIN          3

#define bh1415f_clk_out()                   \
    do                                      \
    {                                       \
        BH1415F_PORT->OUT &= ~BIT(CLK_PIN); \
        BH1415F_PORT->DIR &= ~BIT(CLK_PIN); \
        BH1415F_PORT->PD |= BIT(CLK_PIN);   \
        BH1415F_PORT->PU &= ~BIT(CLK_PIN);  \
        BH1415F_PORT->HD |= (BIT(CLK_PIN)); \
    } while (0)
    
#define bh1415f_clk_h()                     \
    do                                      \
    {                                       \
        BH1415F_PORT->OUT |= BIT(CLK_PIN);  \
        BH1415F_PORT->DIR &= ~BIT(CLK_PIN); \
    } while (0)

#define bh1415f_clk_l()                     \
    do                                      \
    {                                       \
        BH1415F_PORT->OUT &= ~BIT(CLK_PIN); \
        BH1415F_PORT->DIR &= ~BIT(CLK_PIN); \
    } while (0)


#define bh1415f_ce_out()                   \
    do                                     \
    {                                      \
        BH1415F_PORT->OUT &= ~BIT(CE_PIN); \
        BH1415F_PORT->DIR &= ~BIT(CE_PIN); \
        BH1415F_PORT->PD |= BIT(CE_PIN);   \
        BH1415F_PORT->PU &= ~BIT(CE_PIN);  \
        BH1415F_PORT->HD |= (BIT(CE_PIN)); \
    } while (0)

#define bh1415f_ce_h()                     \
    do                                     \
    {                                      \
        BH1415F_PORT->OUT |= BIT(CE_PIN);  \
        BH1415F_PORT->DIR &= ~BIT(CE_PIN); \
    } while (0)

#define bh1415f_ce_l()                     \
    do                                     \
    {                                      \
        BH1415F_PORT->OUT &= ~BIT(CE_PIN); \
        BH1415F_PORT->DIR &= ~BIT(CE_PIN); \
    } while (0)


#define bh1415f_da_out()                   \
    do                                     \
    {                                      \
        BH1415F_PORT->OUT &= ~BIT(DA_PIN); \
        BH1415F_PORT->DIR &= ~BIT(DA_PIN); \
        BH1415F_PORT->PD |= BIT(DA_PIN);   \
        BH1415F_PORT->PU &= ~BIT(DA_PIN);  \
        BH1415F_PORT->HD |= (BIT(DA_PIN)); \
    } while (0)

#define bh1415f_da_h()                     \
    do                                     \
    {                                      \
        BH1415F_PORT->OUT |= BIT(DA_PIN);  \
        BH1415F_PORT->DIR &= ~BIT(DA_PIN); \
    } while (0)

#define bh1415f_da_l()                     \
    do                                     \
    {                                      \
        BH1415F_PORT->OUT &= ~BIT(DA_PIN); \
        BH1415F_PORT->DIR &= ~BIT(DA_PIN); \
    } while (0)

void bh1415_init(u16 fre);
void bh1415_set_freq(u16 fre);

#endif  /* _BH1415F_H */

3.2bh1415f.c

#include "sdk_cfg.h"

#if BH1415

#include "fmtx_api.h"
#include "bh1415f.h"

FMTX_API bh1415_api = {
    .init = bh1415_init,
    // .start = qn8027_transmit_start,
    // .stop = qn8027_transmit_stop,
    .set_freq = bh1415_set_freq,
    // .set_power = qn8027_set_power,
};

void bh1415_write_1_byte(u8 dat)
{
    for (int i = 0; i < 8; i++)
    {
        bh1415f_clk_l();
        if (((dat >> i) & 0x01) == 0x01)
            bh1415f_da_h();
        else
            bh1415f_da_l();
        bh1415_delay();
        bh1415f_clk_h();
        bh1415_delay();
    }
}

/// @brief 初始化函数
/// @param fre 初始频率 单位:0.1MHz
void bh1415_init(u16 fre)
{
    puts("bh1415_init1******************\n");
    bh1415f_clk_out();
    bh1415f_ce_out();
    bh1415f_da_out();

    bh1415f_da_l();
    bh1415f_clk_l();
    bh1415f_ce_l();

    bh1415_set_freq(fre);
}

/// @brief 设置频率
/// @param fre 频率 单位:0.1MHz
void bh1415_set_freq(u16 fre)
{
    puts("bh1415_set_freq****************\n");
    bh1415_printf("set freq : %d\n", fre);

    u16 temp = 0;
    temp = (fre & 0x7ff) | ((0x01) << 11) | (0x4 << 12);
    bh1415f_ce_h();
    bh1415_write_1_byte(temp);
    bh1415_write_1_byte(temp >> 8);
    bh1415f_da_l();
    bh1415f_clk_l();
    bh1415f_ce_l();
}

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值