// 同步模块业务驱动-实现各业务逻辑
// 杭州秒寻科技有限公司
// 周涛
// 2023-11-09

#include "includes.h"

// 写寄存器(一个字节)
// byAddress:寄存器地址
// byData:数据
void driverapp_sync_write_byte(uint8 byAddress, uint8 byData)
{
    uint8 byNewAddress = byAddress & 0x7F; // 写操作

    // 片选产生下降沿
    driver_syncspi_spi_start();

    // 发送寄存器地址
    driver_syncspi_exchange_byte(byNewAddress);

    // 发送数据
    driver_syncspi_exchange_byte(byData);

    // 片选产生上升沿
    driver_syncspi_spi_stop();

    return;
}

// 连续写入一组数据
// pbyData:数据首地址
// wLen:数据长度
void driverapp_sync_write_bytes(uint8 byRegAddress, uint8 *pbyData, uint16 wLen)
{
    uint8 byAddress = byRegAddress & 0x7F; // 写操作(0x7B表示连续操作寄存器)

    // 片选产生下降沿
    driver_syncspi_spi_start();

    // 发送寄存器地址
    driver_syncspi_exchange_byte(byAddress);

    // 发送数据
    for (uint16 i = 0; i < wLen; i++)
    {
        driver_syncspi_exchange_byte(pbyData[i]);
    }

    // 片选产生上升沿
    driver_syncspi_spi_stop();

    return;
}

// 读一个寄存器
// byAddress:寄存器地址
void driverapp_sync_read_byte(uint8 byAddress, uint8 *pbyData)
{
    uint8 byNewAddress = byAddress | 0x80; // 读操作
    uint8 byReceiveData = 0;

    // 片选产生下降沿
    driver_syncspi_spi_start();

    // 发送寄存器地址
    driver_syncspi_exchange_byte(byNewAddress);

    // 发送交换引子，可以是任意数据
    byReceiveData = driver_syncspi_exchange_byte(byNewAddress);

    // 片选产生上升沿
    driver_syncspi_spi_stop();

    *pbyData = byReceiveData;

    return;
}

// 连续读取多个字节
// byAddress:寄存器地址
// pbyData:数据首地址
// wLen:数据长度
void driverapp_sync_read_bytes(uint8 byRegAddress, uint8 *pbyData, uint16 wLen)
{
    uint8 byNewAddress = byRegAddress | 0x80; // 读操作

    // 片选产生下降沿
    driver_syncspi_spi_start();

    // 发送寄存器地址
    driver_syncspi_exchange_byte(byNewAddress);

    // 按字节读取
    for (uint16 i = 0; i < wLen; i++)
    {
        pbyData[i] = driver_syncspi_exchange_byte(byNewAddress);
    }

    // 片选产生上升沿
    driver_syncspi_spi_stop();

    return;
}

// 芯片复位
void driverapp_sync_reset()
{
    driver_syncspi_reset();
}

// 配置同步模块频率
void driverapp_sync_config_freq(uint32 dwFreq)
{
    FREQ_CFG stFreqCfg = {0};

    // 组织数据(SYMBOL_RATE <= 2*DEVIATION)
    stFreqCfg.FREQUENCRY = (int32)dwFreq; // 中心频率
    stFreqCfg.DEVIATION = 1200;           // fsk频率偏移
    stFreqCfg.SYMBOL_RATE = 2400;         // 符号率
    stFreqCfg.XTAL_PPM = 5;               // 晶振误差

    // 配置频率
    sync_freq_config(&stFreqCfg);

    return;
}
