# C



## Getting started

嵌入式c代码示例，支持处理器型号
* stm32G431CB
* ts

## 示例代码目录结构

lib文件夹内为读取手指的库文件
其中iic目录中为对应芯片的iic通信封装层
sample文件夹内包含具体芯片的示例工程
thirdPart文件夹为第三方工具


## 代码使用说明
代码实现方式为分层式的设计，通过“hal.h"的封装使具体芯片的通信接口和上层传感器驱动隔离。用户需要实现iic通信接口(参考“lib/iic”目录中已经实现的芯片)，然后在用户应用代码中添加初始化和处理函数。
使用pca扩展iic接口：
~~~
    const uint8_t pcaIndexdef[6] = {4, 5, 6, 3, 2, 0};
    fingerInit(true, pcaIndexdef);

    while(1)
    {
        /// 用户代码

        fingerDeal();

        /// 用户代码
    }
~~~
不使用pca扩展iic接口：
~~~
    fingerInit(false, NULL);

    while(1)
    {
        /// 用户代码

        fingerDeal();

        /// 用户代码
    }
~~~

## iic移植说明

iic读写分为中断（DMA）和轮询方式，此demo中使用pca扩展iic方式暂时只支持轮询读写，不使用pca方式可以使用中断或轮询方式。
stm32G431CB的示例代码支持pca扩展和iic直通方式，他山控制板只支持pca模式

pca模式下iic驱动只支持一个iic端口，直通模式下的代码实现为每个传感器一个独立的iic物理接口。

用户移植iic需要实现如下结构体中函数的定义
~~~
typedef struct{
    uint8_t port;           ///< 使用哪个iic接口
    uint8_t step;
    finger_cmd  cmd;
    
    I2C_Transfer_Status (*write)(uint8_t port, uint32_t addr, uint8_t *data, uint16_t size);
    I2C_Transfer_Status (*read)(uint8_t port, uint32_t addr, uint8_t *data, uint16_t size);

    void (*delayMs)(uint32_t ms);///< ms延时
    uint32_t (*getTimeMs)(void);///< 读取当前时间戳，ms
} I2C_PlatformInterface_t;
~~~

## 电容数据的读取
示例代码会定时读取传感器的数据，包含电容原始值、三维力数据、接近变化。
todo 添加用户读取接口

~~~
    /// 打印
    debugPrintfNoFile(0, "finger=%d, capChannelDat = ", finger->addr);
    for(uint16_t i=0; i<finger->para.sensorNum; i++)
    {
        /// 电容原始值
        debugPrintfNoFile(0, "%d ", finger->capData.capChannelData[i]);
    }
    debugPrintfNoFile(0, "\n");

    for (uint16_t i = 0; i<finger->para.yddsNum; i++)
    {
        /// 三维力
        debugPrintfNoFile(0, "ydds[%d]: nf=%d, tf=%d, tfdif=%d\r\n", i, (uint32_t)(finger->capData.yddsData[i].nf*1000), (uint32_t)(finger->capData.yddsData[i].tf*1000), finger->capData.yddsData[i].tfDir);
    }

    for (uint16_t i = 0; i<finger->para.sProxNum; i++)
    {
        /// 互自电容接近
        debugPrintfNoFile(0, "sProx[%d]: sProx=%d ", i, finger->capData.sProxCapData[i]);
    }

    for (uint16_t i = 0; i<finger->para.mProxNum; i++)
    {
        /// 互电容接近
        debugPrintfNoFile(0, "sProx[%d]: mProx=%d ", i, finger->capData.mProxCapData[i]);
    }
    debugPrintfNoFile(0, "\n");
~~~



## pca通道定义

通用转接板（stm32G431）
![图片说明](./传感器iic地址和转接板位置定义.png) 

ts
todo 待补充

## 使用注意事项

fingerDeal();函数调度周期小于10ms，否则电容读取频次会受影响。
单线程操作，如果需要多线程支持用户自行设计