基于STC8单片机的Si4702驱动
简介
某宝随便买的,以为开发起来会很顺利没想到还是掉坑了,主要是因为没有详细阅读其数据手册导致。
没有示例代码也只有这么一张图,通过比对数据手册猜测这是一个2线通信的模块,而9脚的置位使能端其实就是芯片RST#引脚。
按上图的引脚定义连接到单片机就行了,注意每个引脚都需要串一个电阻,作用有两个:
第一下面的STC评估板在断电重启时不会断开上层扩展板电源,这导致有可能发生IO间的电流灌入导致无法成功烧录。STC烧录时需要冷重启,且所有IO不能灌入太大的电流,否则将失败。
第二个作用主要是因为模块是3.3V供电,而STC这边是5V,数据线电平不一致我又懒得上电平转换电路,所以串连1K电阻限制一下电流。
复位时序及2线模式选择
模式选择直接看表9就可以了,因为是模块那些IO已经给设置好了。
千万不要被这里SEN#带坑里,这里不是模块的置位使能端
然后这附近的说明要仔细看
复位时序总结下来就是:
SCL拉高
SDA拉高
RST拉低
延时等一下
RST拉高
SDA拉高
接着启用振荡器器,07H寄存器里的XOSCEN位使能,重点bit13:0=0x0100,这里的说明一定要仔细看
把寄存器数据更新一下等待振荡器稳定,经过我的测试大约需要500ms,建议不低于此时长。
启动后进行上电操作,即:
02H[bit 0]ENABLE=1
07H[bits13:0]=0x3C04
其他设置看代码吧。
/**
* @brief 初始化
*
*/
void si4702_init() {
si4702_delay_100ms();
SI_RST_PIN_INIT;
soft_i2c_init();
SOFT_I2C_SCL = 1;
SOFT_I2C_SDA = 0;
SI_RST = 0;
si4702_delay_200us();
SI_RST = 1;
si4702_delay_200us();
SOFT_I2C_SDA = 1;
si4702_delay_200us();
//启用晶振
siRegData[SI_REG_07H] = SI_XOSCEN | SI_07H_13_0_EN0; //当0x02H bit0 ENABLE = 0 时 bits 13:0 要设置为 0x0100
si4702_update();
//等待振荡器稳定
si4702_delay_100ms();
si4702_delay_100ms();
si4702_delay_100ms();
si4702_delay_100ms();
si4702_delay_100ms();
//初始化配置
siRegData[SI_REG_02H] |= SI_DSMUTE | SI_DMUTE | SI_ENABLE; //禁用软静音,禁用静音,启用电源; 软静音可减弱没有信号时的白噪声
siRegData[SI_REG_03H] = 0x0000;
siRegData[SI_REG_04H] |= SI_DE; // 50us预加重 与增益有关,预加重电路
siRegData[SI_REG_05H] |= SI_BAND | SI_SPACE | 8; // 波段 信道间隔 音量 默认为8 范围0-15
siRegData[SI_REG_07H] = SI_XOSCEN | SI_07H_13_0_EN1; //当0x02H bit0 ENABLE = 0 时 bits 13:0 要设置为 0x3C04
si4702_update();
//等待上电
si4702_delay_100ms();
si4702_delay_100ms();
}
完整的代码
main.c
/**
* @file main.c
* @author WangBo
* @brief STC8G2K64S2-48PIN @ 11.0592Mhz 使用Keil 5编译
* @version 0.1
* @date 2022-05-21
*
* @copyright Copyright (c) 2022
*
* @note 随便写的测试代码
*
*/
#include "STC8G.H"
#include "INTRINS.H"
#include "io.h"
#include "uart.h"
#include "si4702.h"
unsigned char uartBuf[16];
unsigned char uartBufIdx = 0;
bit uartRecvFlag = 0;
unsigned char vol = 8;
unsigned int freq = 917;
void main() {
si4702_init();
si4702_set_vol(vol);
si4702_set_freq(freq);
while (1) {
}
}
si4702.h
#ifndef __SI4702_H__
#define __SI4702_H__
#include "STC8G.H"
#include "INTRINS.H"
#include "software_i2c.h"
#define SI_ADD