generated from hulk/gd32e23x_template
	Compare commits
	
		
			65 Commits
		
	
	
		
			21a5a2e783
			...
			feature_ri
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8348652425 | |||
| c9e994f0c2 | |||
| 1b65f75da7 | |||
| 742ede30d4 | |||
| b3dea747d0 | |||
| 6c51f0203a | |||
| 1752e3824c | |||
| e1277c9c7a | |||
| 3ed6a69014 | |||
| 8eaf1f43bc | |||
| 1c7417371e | |||
| 6310977c99 | |||
| e8f0161e32 | |||
| 7a91986b9b | |||
| 61ddbcf2cd | |||
| 688866108c | |||
| fd2f72914d | |||
| db780ba529 | |||
| 2a0e0b40b6 | |||
| 6c37fecd28 | |||
| a9599bae5e | |||
| da22e0eff9 | |||
| 892c59c2d3 | |||
| b94a430ba2 | |||
| 8cd24132a6 | |||
| e2e17d870c | |||
| d359ab5320 | |||
| 0ebe9c5d16 | |||
| 444804efe4 | |||
| e89169582d | |||
| 19e73080e6 | |||
| 0ac221ce6f | |||
| 9b9f14f97a | |||
| 7d6be9f390 | |||
| 97587ba990 | |||
| 6792caa04f | |||
| ce6289a82a | |||
| 67ea11a45e | |||
| 4d98e4dc30 | |||
| 9a07dba591 | |||
| a64b1427de | |||
| f130674630 | |||
| d356658079 | |||
| 7a7ed3e369 | |||
| 6c9543648f | |||
| bb61f0be6b | |||
| 378dafdc2d | |||
| eca38a53b8 | |||
| fca25e1981 | |||
| 15730d7234 | |||
| 6702703031 | |||
| ed8b6b3f6d | |||
| 23a8e1d978 | |||
| f081fdac63 | |||
| 569d99cbf3 | |||
| fa7f364bdb | |||
| 2d273efef5 | |||
| 8fa7ed32d8 | |||
| 05fb90c727 | |||
| 4dc9054544 | |||
| 5838f18742 | |||
| dc8bff918d | |||
| f550619217 | |||
| b307160ba0 | |||
| 8e2cdd1ac5 | 
| @@ -4,10 +4,12 @@ include(cmake/toolchain.cmake) | |||||||
| project(xlsw_3dp_LDC1612) | project(xlsw_3dp_LDC1612) | ||||||
|  |  | ||||||
| set(VERSION_MAJOR 0) | set(VERSION_MAJOR 0) | ||||||
| set(VERSION_MINOR 1) | set(VERSION_MINOR F) | ||||||
| set(VERSION_PATCH 0) | set(VERSION_PATCH 1) | ||||||
| set(VERSION "V${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") | set(VERSION "V${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") | ||||||
| string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") | string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") | ||||||
|  | set(IIC_TYPE "AutoDetectDriveCurrent") | ||||||
|  | #set(IIC_TYPE "HW-IIC") | ||||||
|  |  | ||||||
| enable_language(C) | enable_language(C) | ||||||
| enable_language(CXX) | enable_language(CXX) | ||||||
| @@ -29,6 +31,8 @@ set(TARGET_C_SRC | |||||||
|         ${CMAKE_SOURCE_DIR}/src/rs485.c |         ${CMAKE_SOURCE_DIR}/src/rs485.c | ||||||
|         ${CMAKE_SOURCE_DIR}/src/led.c |         ${CMAKE_SOURCE_DIR}/src/led.c | ||||||
|         ${CMAKE_SOURCE_DIR}/src/i2c.c |         ${CMAKE_SOURCE_DIR}/src/i2c.c | ||||||
|  |         ${CMAKE_SOURCE_DIR}/src/soft_i2c.c | ||||||
|  |         ${CMAKE_SOURCE_DIR}/src/fwdgt.c | ||||||
| ) | ) | ||||||
|  |  | ||||||
| add_executable(xlsw_3dp_LDC1612 ${TARGET_C_SRC}) | add_executable(xlsw_3dp_LDC1612 ${TARGET_C_SRC}) | ||||||
|   | |||||||
							
								
								
									
										79
									
								
								CommunicationProtocol.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								CommunicationProtocol.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | # 电涡流传感器模块通信协议 | ||||||
|  |  | ||||||
|  | ## 电涡流传感器模块通信协议 | ||||||
|  |  | ||||||
|  | | **序号** | **修改内容** | **版本** | **日期**     | **修改人** | | ||||||
|  | |:------:|:--------:|:------:|:----------:|:-------:| | ||||||
|  | | 1      | 初版       | V1.0   | 2024-12-25 | Hulk    | | ||||||
|  | |        |          |        |            |         | | ||||||
|  | |        |          |        |            |         | | ||||||
|  | |        |          |        |            |         | | ||||||
|  |  | ||||||
|  | ### 发包格式 | ||||||
|  |  | ||||||
|  | | **包头** | **类型** | **数据长度**    | **数据** | **校验** | | ||||||
|  | |:------:|:------:|:-----------:|:------:|:------:| | ||||||
|  | | D5     | 0x03   | Data Length |  Data  | CRC    | | ||||||
|  |  | ||||||
|  | - 数据长度只包含数据部分,不包含包头、类型、数据长度、校验 | ||||||
|  | - CRC求和校验,包含类型、数据长度、数据 | ||||||
|  | - 数据部分为ascii码 | ||||||
|  |  | ||||||
|  | ### 回包格式 | ||||||
|  |  | ||||||
|  | | **包头** |  **状态码**   | **数据长度**    | **数据** | **校验** | | ||||||
|  | |:------:|:----------:|:-----------:|:------:|:------:| | ||||||
|  | |   B5   |  0xF0 正常包  | Data Length |  Data  | CRC    | | ||||||
|  | |   B5   | 0xF1 CRC错误 | Data Length |  Data  | CRC    | | ||||||
|  | |   B5   | 0xF2 包头错误  | Data Length |  Data  | CRC    | | ||||||
|  | |   B5   | 0xF3 类型错误  | Data Length |  Data  | CRC    | | ||||||
|  | |   B5   | 0xF4 包长度错误 | Data Length |  Data  | CRC    | | ||||||
|  |  | ||||||
|  | - 数据长度只包含数据部分,不包含包头、类型、数据长度、校验 | ||||||
|  | - CRC求和校验,包含状态码、数据长度、数据 | ||||||
|  | - 有效数据部分为uint32_t,高字节在前 | ||||||
|  | - 包错误和指令错误时,数据部分为ascii码 `err` | ||||||
|  |  | ||||||
|  | ------------------- | ||||||
|  |  | ||||||
|  | ## 电涡流传感器模块功能 | ||||||
|  |  | ||||||
|  | ### 1. 读取电涡流传感器模块数据 | ||||||
|  |  | ||||||
|  | - 发送M1指令,读取电涡流传感器模块数据。 | ||||||
|  |     - `D5 03 02 4D 31 83` | ||||||
|  | - 电涡流传感器模块涡流回复数据 | ||||||
|  |     - `B5 F0 04 01 AE 1B E4 A2`, 有效数据为 `0x01AE1BE4`,转换为`28187620` | ||||||
|  |     - `B5 F0 04 04 19 C1 FA CC`, 有效数据为 `0x0419C1FAD2`,转换为`17612012242` | ||||||
|  | - 错误命令(M3指令)回包 | ||||||
|  |     - `B5 F0 03 65 72 72 3C`,有效数据为 `err` | ||||||
|  | - CRC错误回包 | ||||||
|  |     - `B5 F1 03 65 72 72 3D`, 有效数据为 `err` | ||||||
|  | - 包头错误回包 | ||||||
|  |     - `B5 F2 03 65 72 72 3E`, 有效数据为 `err` | ||||||
|  | - 类型错误回包 | ||||||
|  |     - `B5 F3 03 65 72 72 3F`, 有效数据为 `err` | ||||||
|  | - 数据长度错误回包 | ||||||
|  |     - `B5 F4 03 65 72 72 40`, 有效数据为 `err` | ||||||
|  |  | ||||||
|  | ### 2. 读取电涡流传感器模块温度补偿数据 | ||||||
|  |  | ||||||
|  | - 发送M2指令,读取电涡流传感器模块数据。 | ||||||
|  |     - `D5 03 02 4D 32 84` | ||||||
|  | - 电涡流传感器模块温度补偿回复数据 | ||||||
|  |     - `B5 F0 04 00 03 40 85 BC`, 有效数据为 `0x00034085`,转换为`213125`(单位为摄氏度*10)温度为21.3125℃ | ||||||
|  |     - `B5 F0 04 00 03 89 C3 43`, 有效数据为 `0x000389C3`,转换为`231875`(单位为摄氏度*10)温度为23.1875℃ | ||||||
|  | - 错误命令(M3指令)回包 | ||||||
|  |     - `B5 F0 03 65 72 72 3C`,有效数据为 `err` | ||||||
|  | - CRC错误回包 | ||||||
|  |     - `B5 F1 03 65 72 72 3D`, 有效数据为 `err` | ||||||
|  | - 包头错误回包 | ||||||
|  |     - `B5 F2 03 65 72 72 3E`, 有效数据为 `err` | ||||||
|  | - 类型错误回包 | ||||||
|  |     - `B5 F3 03 65 72 72 3F`, 有效数据为 `err` | ||||||
|  | - 数据长度错误回包 | ||||||
|  |     - `B5 F4 03 65 72 72 40`, 有效数据为 `err` | ||||||
|  |  | ||||||
|  | ### 3. 读取数据时间间隔 | ||||||
|  |  | ||||||
|  | - 推荐数据时间间隔至少为500ms | ||||||
							
								
								
									
										204
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										204
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,63 +1,153 @@ | |||||||
| # gd32e23x_template | # XLSW-3DP-Sensor-LDC1612 | ||||||
| 本项目为GD32E230Fx系列的基于Clion的CMake开发的工程模板。本人暂未入门,强行上强度,放弃keil,拥抱开源。遂尝试使用arm-none-eabi-gcc进行开发。 |  | ||||||
| 有幸寻得[@mo10 ](https://github.com/mo10)大佬的帮助,本项目的基础目录架构与CMakeLists.txt与toolchain.cmake均为大佬提供。 |  | ||||||
|  |  | ||||||
| ## 关于C标准库的printf的重写 | | **版本号** |      **修改内容**       |   **日期**   | **修改人** | | ||||||
| 在Keil开发中,ARMClang有自己的microLIB,所以直接调用,然后重写fputc函数即可,但在gcc中需要重写`_write`函数,本项目模板中已经在`main.c`中完成重写。 | |:-------:|:-------------------:|:----------:|:-------:| | ||||||
| 同时需要添加`--spaces=nano.spaces`编译参数。 | | v0.2.0  | 实现软件与硬件IIC可自选,添加看门狗 | 2024-12-29 | Hulk    | | ||||||
| 但是printf本身占用flash比较大,建议谨慎使用,尤其是本项目搭建时候采用的型号为`GD32E230F4V6`内存非常有限,重写后加上spaces设置,目前能用。 |  | ||||||
|  |  | ||||||
| ## 添加源文件与头文件 | ## 电涡流传感器模块通信协议 | ||||||
| 在`ProjectDir/CMakeLists.txt`中21行左右,添加对应源文件即可。 |  | ||||||
|  |  | ||||||
| ```cmake | 通信协议:[LDC1612通信协议](CommunicationProtocol.md) | ||||||
| set(TARGET_C_SRC |  | ||||||
|         ${CMAKE_SOURCE_DIR}/src/main.c | --- | ||||||
|         ${CMAKE_SOURCE_DIR}/src/gd32e23x_it.c |  | ||||||
|         ${CMAKE_SOURCE_DIR}/src/systick.c | ## LDC1612寄存器配置 | ||||||
|         ${CMAKE_SOURCE_DIR}/src/peripheral.c | ### **1. 软件复位 (RESET_DEV)** | ||||||
| ) | - **寄存器地址**: 0x1C | ||||||
|  | - **写入值**: 0x8000 | ||||||
|  | - **字段解析**: | ||||||
|  |     - **Bit 15 (RESET_DEV)**: 写1触发硬件复位,完成后自动清零。 | ||||||
|  |     - **Bits 14-0**: 保留位,必须写0。 | ||||||
|  |  | ||||||
|  | ### **2. 进入休眠模式 (CONFIG)** | ||||||
|  | - **寄存器地址**: 0x1A | ||||||
|  | - **写入值**: 0x2801 | ||||||
|  | - **字段解析**(按位分解): | ||||||
|  |  | ||||||
|  |   | Bit位 | 字段名                | 值   | 功能说明                  | | ||||||
|  |     |-------|-----------------------|-----|--------------------------| | ||||||
|  |   | 15-14 | ACTIVE_CHAN           | 00  | 未使用(休眠模式下无效)     | | ||||||
|  |   | 13    | SLEEP_MODE_EN         | 1   | 使能休眠模式               | | ||||||
|  |   | 12    | RP_OVERRIDE_EN        | 0   | 禁用Rp覆盖(默认)          | | ||||||
|  |   | 11    | SENSOR_ACTIVATE_SEL   | 0   | 全电流激活模式             | | ||||||
|  |   | 10    | AUTO_AMP_DIS          | 0   | 启用自动幅度校正           | | ||||||
|  |   | 9     | REF_CLK_SRC           | 0   | 使用内部时钟源             | | ||||||
|  |   | 8     | Reserved              | 0   | 保留位                    | | ||||||
|  |   | 7     | INTB_DIS              | 0   | 使能INTB中断              | | ||||||
|  |   | 6     | HIGH_CURRENT_DRV      | 0   | 禁用高电流驱动模式         | | ||||||
|  |   | 5-0   | Reserved              | 000001 | 保留位(默认值)          | | ||||||
|  |  | ||||||
|  | ### **3. 配置通道0时钟分频 (CLOCK_DIVIDERS_CH0)** | ||||||
|  | - **寄存器地址**: 0x14 | ||||||
|  | - **写入值**: 0x1002 | ||||||
|  | - **字段解析**: | ||||||
|  |  | ||||||
|  |   | 字段名             | 位域      | 值    | 功能说明                  | | ||||||
|  |     |--------------------|-----------|-------|--------------------------| | ||||||
|  |   | CH0_FIN_DIVIDER    | Bits 15-12 | 0x1   | 传感器分频系数=1(不分频) | | ||||||
|  |   | Reserved           | Bits 11-10 | 0x0   | 保留位                   | | ||||||
|  |   | CH0_FREF_DIVIDER   | Bits 9-0   | 0x002 | 参考分频系数=2,f_REF=40MHz/2=20MHz | | ||||||
|  |  | ||||||
|  | ### **4. 设置通道0转换时间 (RCOUNT_CH0)** | ||||||
|  | - **寄存器地址**: 0x08 | ||||||
|  | - **写入值**: 0x04D6 (十进制1238) | ||||||
|  | - **计算公式**: | ||||||
|  |  | ||||||
|  |   \[ | ||||||
|  |   t_{C0} = \frac{(0x04D6 \times 16)}{20\text{MHz}} = 991\mu s | ||||||
|  |   \] | ||||||
|  |  | ||||||
|  | ### **5. 设置通道0稳定时间 (SETTLECOUNT_CH0)** | ||||||
|  | - **寄存器地址**: 0x10 | ||||||
|  | - **写入值**: 0x000A (十进制10) | ||||||
|  | - **计算公式**: | ||||||
|  |  | ||||||
|  |   \[ | ||||||
|  |   t_{S0} = \frac{(0x000A \times 16)}{20\text{MHz}} = 8\mu s | ||||||
|  |   \] | ||||||
|  |  | ||||||
|  | ### **6. 配置通道0驱动电流 (DRIVE_CURRENT_CH0)** | ||||||
|  | - **寄存器地址**: 0x1E | ||||||
|  | - **写入值**: 0x9000 | ||||||
|  | - **字段解析**: | ||||||
|  |  | ||||||
|  |   | 字段名             | 位域      | 值    | 功能说明                  | | ||||||
|  |     |--------------------|-----------|-------|--------------------------| | ||||||
|  |   | CH0_IDRIVE         | Bits 15-11 | 0x12  | 驱动电流值=18(对应Rp=6.6kΩ,查表9) | | ||||||
|  |   | CH0_INIT_IDRIVE    | Bits 10-6  | 0x00  | 初始电流值(未使用)        | | ||||||
|  |   | Reserved           | Bits 5-0   | 0x00  | 保留位                   | | ||||||
|  |  | ||||||
|  | ### **7. 多通道扫描配置 (MUX_CONFIG)** | ||||||
|  | - **寄存器地址**: 0x1B | ||||||
|  | - **写入值**: 0x820C | ||||||
|  | - **字段解析**: | ||||||
|  |  | ||||||
|  |   | 字段名             | 位域      | 值    | 功能说明                  | | ||||||
|  |     |--------------------|-----------|-------|--------------------------| | ||||||
|  |   | AUTOSCAN_EN        | Bit 15    | 1     | 启用自动扫描模式           | | ||||||
|  |   | RR_SEQUENCE        | Bits 14-13 | 00   | 扫描顺序:Ch0→Ch1          | | ||||||
|  |   | Reserved           | Bits 12-3 | 0x020 | 保留位(默认值)           | | ||||||
|  |   | DEGLITCH           | Bits 2-0   | 0x4   | 去抖动滤波器带宽=3.3MHz    | | ||||||
|  |  | ||||||
|  | ### **8. 退出休眠并启动转换 (CONFIG)** | ||||||
|  | - **寄存器地址**: 0x1A | ||||||
|  | - **写入值**: 0x1601 | ||||||
|  | - **字段解析**(关键位): | ||||||
|  |  | ||||||
|  |   | Bit位 | 字段名                | 值   | 功能说明                  | | ||||||
|  |     |-------|-----------------------|-----|--------------------------| | ||||||
|  |   | 13    | SLEEP_MODE_EN         | 0   | 退出休眠模式              | | ||||||
|  |   | 9     | REF_CLK_SRC           | 1   | 使用外部时钟(CLKIN=40MHz)| | ||||||
|  |   | 12    | RP_OVERRIDE_EN        | 1   | 启用Rp覆盖(固定驱动电流) | | ||||||
|  |  | ||||||
|  | ### **关键参数总结表** | ||||||
|  | | 寄存器名             | 地址  | 写入值 | 核心功能                     | | ||||||
|  | |----------------------|-------|--------|----------------------------| | ||||||
|  | | RESET_DEV            | 0x1C  | 0x8000 | 强制复位设备                 | | ||||||
|  | | CONFIG (休眠)        | 0x1A  | 0x2801 | 进入配置模式                 | | ||||||
|  | | CLOCK_DIVIDERS_CH0   | 0x14  | 0x1002 | 通道0时钟分频设置            | | ||||||
|  | | RCOUNT_CH0           | 0x08  | 0x04D6 | 通道0转换时间=991μs          | | ||||||
|  | | SETTLECOUNT_CH0      | 0x10  | 0x000A | 通道0稳定时间=8μs            | | ||||||
|  | | DRIVE_CURRENT_CH0    | 0x1E  | 0x9000 | 通道0驱动电流=18(约1.5mA)  | | ||||||
|  | | MUX_CONFIG           | 0x1B  | 0x820C | 启用双通道扫描(Ch0→Ch1)    | | ||||||
|  | | CONFIG (启动)        | 0x1A  | 0x1601 | 退出休眠,启用外部时钟       | | ||||||
|  |  | ||||||
|  | 通过以上配置,设备将按以下流程运行: | ||||||
|  | 1. 复位后进入休眠模式,配置寄存器。 | ||||||
|  | 2. 设置通道0的时钟分频、转换时间、稳定时间和驱动电流。 | ||||||
|  | 3. 启用双通道自动扫描,设置去抖动滤波器。 | ||||||
|  | 4. 退出休眠模式,开始连续转换。 | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## **自动校准配置(可选)** | ||||||
|  | ### **适用场景** | ||||||
|  | - Rp未知或环境变化大时,通过自动校准获取初始电流值。 | ||||||
|  |  | ||||||
|  | ### **操作流程** | ||||||
|  | 1. **设置目标至最大距离** | ||||||
|  | 2. **进入休眠模式**: | ||||||
|  |    ```c | ||||||
|  |    write_register(0x1A, 0x2801); // SLEEP_MODE_EN=1 | ||||||
|    ``` |    ``` | ||||||
| ## 关于链接脚本 | 3. **启用自动校准**: | ||||||
| 注意芯片选型, 不同型号的芯片 FLASH 和 RAM 大小不同。需要修改链接脚本`ld/gd32e23x_gcc.ld` |    ```c | ||||||
|  |    // CLOCK_DIVIDERS_CH0配置分频 | ||||||
| | 芯片型号       | FLASH | RAM | |    write_register(0x14, 0x1002); // FIN_DIV=1, FREF_DIV=2 | ||||||
| |------------|-------|-----| |    // 禁用Rp覆盖 | ||||||
| | GD32E230F4 | 16K   | 4K  | |    uint16_t config = read_register(0x1A); | ||||||
| | GD32E230F8 | 64K   | 8K  | |    config &= ~(1 << 12); // RP_OVERRIDE_EN=0 | ||||||
|  |    write_register(0x1A, config); | ||||||
| ```linkerscript |    ``` | ||||||
| /* memory map */ | 4. **启动测量并读取初始值**: | ||||||
| MEMORY |    ```c | ||||||
| { |    write_register(0x1A, 0x1601); // 退出休眠 | ||||||
| FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 16K |    delay(10); // 等待至少一次转换完成 | ||||||
| RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 4K |    uint16_t init_value = (read_register(0x1E) >> 6) & 0x1F; // 读取CH0_INIT_IDRIVE | ||||||
| } |    ``` | ||||||
|  | 5. **写入驱动电流**: | ||||||
|  |    ```c | ||||||
|  |    uint16_t drive_current = (init_value << 11) | 0x0000; | ||||||
|  |    write_register(0x1E, drive_current); | ||||||
|    ``` |    ``` | ||||||
|     |     | ||||||
| ## 关于Startup文件 | --- | ||||||
|  |  | ||||||
| [@mo10 ](https://github.com/mo10)大佬提供的一些想法,具体如下。但是我目前还没测试到实际的影响和作用范围,所以暂未同步进来,仅作为备忘内容 |  | ||||||
| ```asm |  | ||||||
| Reset_Handler: |  | ||||||
|     ldr   r0, =_sp |  | ||||||
|     mov   sp, r0 |  | ||||||
|     ldr   r0, =_end |  | ||||||
|     msr   msplim, r0 |  | ||||||
| /* copy the data segment into ram */ |  | ||||||
|     movs  r1, #0 |  | ||||||
|     b  LoopCopyDataInit |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## Ref |  | ||||||
|  |  | ||||||
| 1. 参考LD/Startup |  | ||||||
|  |  | ||||||
| [https://github.com/Noveren/gd32e23x-template/blob/main/gd32e23x/template/linker.ld](https://github.com/Noveren/gd32e23x-template/blob/main/gd32e23x/template/linker.ld) |  | ||||||
|  |  | ||||||
| [https://github.com/Noveren/gd32e23x-template/blob/main/gd32e23x/template/startup.s](https://github.com/Noveren/gd32e23x-template/blob/main/gd32e23x/template/startup.s) |  | ||||||
|  |  | ||||||
| 2. 官方LD/Startup |  | ||||||
|  |  | ||||||
| 使用Embedded Builder工具生成的C标准库生成的模板 |  | ||||||
| @@ -41,12 +41,12 @@ function(print_size_of_target TARGET) | |||||||
|             ) |             ) | ||||||
| endfunction() | endfunction() | ||||||
|  |  | ||||||
| function(_generate_file TARGET PREFIX VERSION DATE OUTPUT_EXTENSION OBJCOPY_BFD_OUTPUT) | function(_generate_file TARGET PREFIX VERSION DATE IIC_TYPE OUTPUT_EXTENSION OBJCOPY_BFD_OUTPUT) | ||||||
|     get_target_property(TARGET_OUTPUT_NAME ${TARGET} OUTPUT_NAME) |     get_target_property(TARGET_OUTPUT_NAME ${TARGET} OUTPUT_NAME) | ||||||
|     if (TARGET_OUTPUT_NAME) |     if (TARGET_OUTPUT_NAME) | ||||||
|         set(OUTPUT_FILE_NAME "${PREFIX}_${VERSION}_${DATE}.${OUTPUT_EXTENSION}") |         set(OUTPUT_FILE_NAME "${PREFIX}_${VERSION}_${DATE}_${IIC_TYPE}.${OUTPUT_EXTENSION}") | ||||||
|     else() |     else() | ||||||
|         set(OUTPUT_FILE_NAME "${TARGET}_${VERSION}_${DATE}.${OUTPUT_EXTENSION}") |         set(OUTPUT_FILE_NAME "${TARGET}_${VERSION}_${DATE}_${IIC_TYPE}.${OUTPUT_EXTENSION}") | ||||||
|     endif() |     endif() | ||||||
|  |  | ||||||
|     get_target_property(RUNTIME_OUTPUT_DIRECTORY ${TARGET} RUNTIME_OUTPUT_DIRECTORY) |     get_target_property(RUNTIME_OUTPUT_DIRECTORY ${TARGET} RUNTIME_OUTPUT_DIRECTORY) | ||||||
| @@ -66,11 +66,11 @@ function(_generate_file TARGET PREFIX VERSION DATE OUTPUT_EXTENSION OBJCOPY_BFD_ | |||||||
| endfunction() | endfunction() | ||||||
|  |  | ||||||
| function(generate_binary_file TARGET PREFIX) | function(generate_binary_file TARGET PREFIX) | ||||||
|     _generate_file(${TARGET} "${PREFIX}" "${VERSION}" "${CURRENT_DATE}" "bin" "binary") |     _generate_file(${TARGET} "${PREFIX}" "${VERSION}" "${CURRENT_DATE}" "${IIC_TYPE}" "bin" "binary") | ||||||
| endfunction() | endfunction() | ||||||
|  |  | ||||||
| function(generate_hex_file TARGET PREFIX) | function(generate_hex_file TARGET PREFIX) | ||||||
|     _generate_file(${TARGET} "${PREFIX}" "${VERSION}" "${CURRENT_DATE}" "hex" "ihex") |     _generate_file(${TARGET} "${PREFIX}" "${VERSION}" "${CURRENT_DATE}" "${IIC_TYPE}" "hex" "ihex") | ||||||
| endfunction() | endfunction() | ||||||
|  |  | ||||||
| set(CMAKE_EXECUTABLE_SUFFIX_C   .elf) | set(CMAKE_EXECUTABLE_SUFFIX_C   .elf) | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								inc/board_config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								inc/board_config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | // | ||||||
|  | // Created by dell on 24-12-28. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #ifndef BOARD_CONFIG_H | ||||||
|  | #define BOARD_CONFIG_H | ||||||
|  |  | ||||||
|  | // #define SOFTWARE_IIC | ||||||
|  |  | ||||||
|  | // #define DEBUG_VERBOES | ||||||
|  |  | ||||||
|  | // #define RS485_MAX13487 | ||||||
|  |  | ||||||
|  | // #define DEBUG_VOFA_TOOL | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | #define RCU_GPIO_I2C         RCU_GPIOF | ||||||
|  | #define RCU_I2C              RCU_I2C0 | ||||||
|  | #define I2C_SCL_PORT         GPIOF | ||||||
|  | #define I2C_SCL_PIN          GPIO_PIN_1 | ||||||
|  | #define I2C_SDA_PORT         GPIOF | ||||||
|  | #define I2C_SDA_PIN          GPIO_PIN_0 | ||||||
|  | #define I2C_GPIO_AF          GPIO_AF_1 | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | #define RS485_RCU            RCU_USART0 | ||||||
|  | #define RS485_GPIO_RCU       RCU_GPIOA | ||||||
|  | #define RS485_GPIO_PORT      GPIOA | ||||||
|  | #define RS485_TX_PIN         GPIO_PIN_2 | ||||||
|  | #define RS485_RX_PIN         GPIO_PIN_3 | ||||||
|  | #define RS485_PHY            USART0 | ||||||
|  | #define RS485_BAUDRATE       115200U | ||||||
|  | #define RS485_EN_PIN         GPIO_PIN_1 | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | #define LED_PORT             GPIOA | ||||||
|  | #define LED_PIN              GPIO_PIN_7 | ||||||
|  | #define LED_RCU              RCU_GPIOA | ||||||
|  | #define LED_BLINK_TIMER_RCU  RCU_TIMER16 | ||||||
|  | #define LED_BLINK_TIMER      TIMER16 | ||||||
|  | #define LED_BLINK_IRQ        TIMER16_IRQn | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | #endif //BOARD_CONFIG_H | ||||||
							
								
								
									
										15
									
								
								inc/fwdgt.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								inc/fwdgt.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | // | ||||||
|  | // Created by yelv1 on 24-12-29. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #ifndef FWDGT_H | ||||||
|  | #define FWDGT_H | ||||||
|  |  | ||||||
|  | #include "gd32e23x.h" | ||||||
|  | #include "board_config.h" | ||||||
|  |  | ||||||
|  | void watchdog_init(void); | ||||||
|  |  | ||||||
|  | void fwdgt_reset_mcu(void); | ||||||
|  |  | ||||||
|  | #endif //FWDGT_H | ||||||
							
								
								
									
										20
									
								
								inc/i2c.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								inc/i2c.h
									
									
									
									
									
								
							| @@ -8,26 +8,26 @@ | |||||||
| #include "gd32e23x_it.h" | #include "gd32e23x_it.h" | ||||||
| #include "gd32e23x.h" | #include "gd32e23x.h" | ||||||
| #include "systick.h" | #include "systick.h" | ||||||
|  | #include "main.h" | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <math.h> | #include <math.h> | ||||||
|  |  | ||||||
| #define I2C_SPEED 20000 | #include "board_config.h" | ||||||
| #define RCU_GPIO_I2C RCU_GPIOF |  | ||||||
| #define RCU_I2C RCU_I2C0 |  | ||||||
| #define I2C_SCL_PORT GPIOF |  | ||||||
| #define I2C_SCL_PIN GPIO_PIN_1 |  | ||||||
| #define I2C_SDA_PORT GPIOF |  | ||||||
| #define I2C_SDA_PIN GPIO_PIN_0 |  | ||||||
| #define I2C_GPIO_AF GPIO_AF_1 |  | ||||||
|  |  | ||||||
| #define I2C_TIME_OUT    (uint16_t)(10000) | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | #define I2C_SPEED       100*(1000) | ||||||
|  |  | ||||||
|  | #define I2C_TIME_OUT    (uint16_t)(5000) | ||||||
| #define I2C_OK          1 | #define I2C_OK          1 | ||||||
| #define I2C_FAIL        0 | #define I2C_FAIL        0 | ||||||
| #define I2C_END         1 | #define I2C_END         1 | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
|     I2C_START = 0, |     I2C_START = 0, | ||||||
|     I2C_SEND_ADDRESS, |     I2C_SEND_ADDRESS, | ||||||
| @@ -36,6 +36,8 @@ typedef enum { | |||||||
|     I2C_STOP |     I2C_STOP | ||||||
| } i2c_process_enum; | } i2c_process_enum; | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
| void i2c_gpio_config(void); | void i2c_gpio_config(void); | ||||||
|  |  | ||||||
| void i2c_config(void); | void i2c_config(void); | ||||||
|   | |||||||
| @@ -13,12 +13,17 @@ | |||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <math.h> | #include <math.h> | ||||||
|  | #include "board_config.h" | ||||||
|  | #include "soft_i2c.h" | ||||||
| #include "i2c.h" | #include "i2c.h" | ||||||
|  |  | ||||||
|  | /***************************************************************************/ | ||||||
|  |  | ||||||
| #define LDC1612_ADDR         (0x2B << 1) | #define LDC1612_ADDR         (0x2B << 1) | ||||||
|  |  | ||||||
| /*Register Rddr*/ | /*Register Rddr*/ | ||||||
| /***************************************************************************/ | /***************************************************************************/ | ||||||
|  |  | ||||||
| #define CONVERTION_RESULT_REG_START             0X00 | #define CONVERTION_RESULT_REG_START             0X00 | ||||||
| #define SET_CONVERSION_TIME_REG_START           0X08 | #define SET_CONVERSION_TIME_REG_START           0X08 | ||||||
| #define SET_CONVERSION_OFFSET_REG_START         0X0C | #define SET_CONVERSION_OFFSET_REG_START         0X0C | ||||||
| @@ -42,19 +47,22 @@ | |||||||
|  |  | ||||||
| /******************************************************************************/ | /******************************************************************************/ | ||||||
|  |  | ||||||
| #define LDC1612_CONVERSION_TIME_CH0        0X0546  //0536 | #define LDC1612_CONVERSION_TIME_CH0        0x0546  //0536 | ||||||
| #define LDC1612_DRIVE_CURRENT              0X9000  //A000 | #define LDC1612_DRIVE_CURRENT              0x9000  //A000 | ||||||
| #define LDC1612_MUX_CONFIG                 0X020C  // no auto scan and filter bandwidth 3.3MHz | #define LDC1612_MUX_CONFIG                 0x020C  // no auto scan and filter bandwidth 3.3MHz | ||||||
| #define LDC1612_SENSOR_CONFIG              0X1601 | #define LDC1612_SENSOR_CONFIG              0x1601 | ||||||
|  | #define LDC1612_SLEEP_MODE                 0x2801 | ||||||
| #define LDC1612_ERROR_CONFIG               0x0000 | #define LDC1612_ERROR_CONFIG               0x0000 | ||||||
| #define LC_STABILIZE_TIME_CH0              0X001E //30 | #define LC_STABILIZE_TIME_CH0              0x001E //30 | ||||||
|  | #define LDC1612_RESET_DEV                  0x8000 //[15:0] 0b1000 0000 0000 0000 | ||||||
|  |  | ||||||
| /******************************************************************************/ | /******************************************************************************/ | ||||||
|  |  | ||||||
| #define COIL_RP_KOM              15.727 | #define COIL_RP_KOM              7.2 | ||||||
| #define COIL_L_UH                33 | #define COIL_L_UH                33 | ||||||
| #define COIL_C_PF                150 | #define COIL_C_PF                150 | ||||||
| #define COIL_Q_FACTOR            35.97 | #define COIL_Q_FACTOR            35.97 | ||||||
|  | #define COIL_FREQ_HZ             2262000 | ||||||
|  |  | ||||||
| /******************************************************************************/ | /******************************************************************************/ | ||||||
|  |  | ||||||
| @@ -88,4 +96,6 @@ uint32_t ldc1612_get_raw_channel_result(uint8_t channel); | |||||||
|  |  | ||||||
| uint32_t ldc1612_parse_raw_result(uint32_t raw_result); | uint32_t ldc1612_parse_raw_result(uint32_t raw_result); | ||||||
|  |  | ||||||
|  | void ldc1612_drvie_current_detect(uint8_t channel); | ||||||
|  |  | ||||||
| #endif //LDC1612_H | #endif //LDC1612_H | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								inc/led.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								inc/led.h
									
									
									
									
									
								
							| @@ -6,20 +6,7 @@ | |||||||
| #define LED_H | #define LED_H | ||||||
|  |  | ||||||
| #include "gd32e23x_it.h" | #include "gd32e23x_it.h" | ||||||
| #include "gd32e23x.h" | #include "board_config.h" | ||||||
| #include "systick.h" |  | ||||||
| #include <stdbool.h> |  | ||||||
| #include <string.h> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <math.h> |  | ||||||
|  |  | ||||||
| #define LED_PORT            GPIOA |  | ||||||
| #define LED_PIN             GPIO_PIN_7 |  | ||||||
| #define LED_RCU             RCU_GPIOA |  | ||||||
| #define LED_TIMER_RCU       RCU_TIMER16 |  | ||||||
| #define LED_TIMER           TIMER16 |  | ||||||
| #define LED_IRQ             TIMER16_IRQn |  | ||||||
|  |  | ||||||
| void led_config(void); | void led_config(void); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								inc/main.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								inc/main.h
									
									
									
									
									
								
							| @@ -35,4 +35,21 @@ OF SUCH DAMAGE. | |||||||
| #ifndef MAIN_H | #ifndef MAIN_H | ||||||
| #define MAIN_H | #define MAIN_H | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include "gd32e23x.h" | ||||||
|  | #include "systick.h" | ||||||
|  | #include "gd32e23x_libopt.h" | ||||||
|  | #include "rs485.h" | ||||||
|  | #include "led.h" | ||||||
|  | #include "ldc1612.h" | ||||||
|  | #include "fwdgt.h" | ||||||
|  | #include "board_config.h" | ||||||
|  |  | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  | #include "soft_i2c.h" | ||||||
|  | #else | ||||||
|  | #include "i2c.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif /* MAIN_H */ | #endif /* MAIN_H */ | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								inc/rs485.h
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								inc/rs485.h
									
									
									
									
									
								
							| @@ -8,25 +8,57 @@ | |||||||
| #include "gd32e23x_it.h" | #include "gd32e23x_it.h" | ||||||
| #include "gd32e23x.h" | #include "gd32e23x.h" | ||||||
| #include "systick.h" | #include "systick.h" | ||||||
| #include <stdbool.h> |  | ||||||
| #include <string.h> |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <string.h> | ||||||
| #include <sys/types.h> | #include <stdbool.h> | ||||||
|  | #include "ldc1612.h" | ||||||
|  | #include "tmp112.h" | ||||||
|  | #include "fwdgt.h" | ||||||
|  | #include "board_config.h" | ||||||
|  |  | ||||||
| #define RS485_RCU            RCU_USART0 | /******************************************************************************/ | ||||||
| #define RS485_GPIO_RCU       RCU_GPIOA |  | ||||||
| #define RS485_GPIO_PORT      GPIOA |  | ||||||
| #define RS485_TX_PIN         GPIO_PIN_2 |  | ||||||
| #define RS485_RX_PIN         GPIO_PIN_3 |  | ||||||
| #define RS485_PHY            USART0 |  | ||||||
| #define RS485_BAUDRATE       115200U |  | ||||||
|  |  | ||||||
| #define RS485_EN_PIN         GPIO_PIN_1 | #define RX_BUFFER_SIZE            32 | ||||||
|  |  | ||||||
| #define RX_BUFFER_SIZE 64 | #define PROTOCOL_PACKAGE_HEADER   0xD5 | ||||||
|  | #define PROTOCOL_BOARD_TYPE       0x03 | ||||||
|  | #define PROTOCOL_PACKAGE_LENGTH   0x02 | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | typedef enum | ||||||
|  | { | ||||||
|  |     VALIDATION_SUCCESS = 0, | ||||||
|  |     VALIDATION_CRC_ERROR = 1, | ||||||
|  |     VALIDATION_HEADER_ERROR = 2, | ||||||
|  |     VALIDATION_TYPE_ERROR = 4, | ||||||
|  |     VALIDATION_LENGTH_ERROR = 8 | ||||||
|  | } validation_result_t; | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | uint8_t Command_Write(uint8_t *data, uint8_t length); | ||||||
|  |  | ||||||
|  | uint8_t Command_GetCommand(uint8_t *command); | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
| void rs485_config(void); | void rs485_config(void); | ||||||
| void process_command(char *cmd); |  | ||||||
|  | void process_command(uint8_t* cmd, size_t length); | ||||||
|  |  | ||||||
|  | uint8_t calculate_crc(uint8_t data[], uint8_t data_length); | ||||||
|  |  | ||||||
|  | validation_result_t validate_package_crc(uint8_t* data, uint8_t data_length); | ||||||
|  |  | ||||||
|  | validation_result_t validate_package_header(uint8_t* data); | ||||||
|  |  | ||||||
|  | validation_result_t validate_package_type(uint8_t* data); | ||||||
|  |  | ||||||
|  | validation_result_t validate_data_length(uint8_t* data); | ||||||
|  |  | ||||||
|  | void eddy_current_value_report(void); | ||||||
|  |  | ||||||
|  | void tempture_value_report(void); | ||||||
|  |  | ||||||
| #endif //RS485_H | #endif //RS485_H | ||||||
							
								
								
									
										53
									
								
								inc/soft_i2c.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								inc/soft_i2c.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | // | ||||||
|  | // Created by dell on 24-12-28. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #ifndef SOFT_I2C_H | ||||||
|  | #define SOFT_I2C_H | ||||||
|  |  | ||||||
|  | #include "gd32e23x_it.h" | ||||||
|  | #include "gd32e23x.h" | ||||||
|  | #include "systick.h" | ||||||
|  | #include "main.h" | ||||||
|  |  | ||||||
|  | #include "board_config.h" | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | #define I2C_SCL_HIGH()      gpio_bit_set(I2C_SCL_PORT, I2C_SCL_PIN) | ||||||
|  | #define I2C_SCL_LOW()       gpio_bit_reset(I2C_SCL_PORT, I2C_SCL_PIN) | ||||||
|  | #define I2C_SDA_HIGH()      gpio_bit_set(I2C_SDA_PORT, I2C_SDA_PIN) | ||||||
|  | #define I2C_SDA_LOW()       gpio_bit_reset(I2C_SDA_PORT, I2C_SDA_PIN) | ||||||
|  | #define I2C_SDA_READ()      gpio_input_bit_get(I2C_SDA_PORT, I2C_SDA_PIN) | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | #define SOFT_I2C_OK          1 | ||||||
|  | #define SOFT_I2C_FAIL        0 | ||||||
|  | #define SOFT_I2C_END         1 | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | void soft_i2c_delay(void); | ||||||
|  |  | ||||||
|  | void soft_i2c_config(void); | ||||||
|  |  | ||||||
|  | void soft_i2c_start(void); | ||||||
|  |  | ||||||
|  | void soft_i2c_stop(void); | ||||||
|  |  | ||||||
|  | void soft_i2c_send_ack(void); | ||||||
|  |  | ||||||
|  | void soft_i2c_send_nack(void); | ||||||
|  |  | ||||||
|  | uint8_t soft_i2c_wait_ack(void); | ||||||
|  |  | ||||||
|  | void soft_i2c_send_byte(uint8_t data); | ||||||
|  |  | ||||||
|  | uint8_t soft_i2c_receive_byte(uint8_t ack); | ||||||
|  |  | ||||||
|  | uint8_t soft_i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]); | ||||||
|  |  | ||||||
|  | uint8_t soft_i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data); | ||||||
|  |  | ||||||
|  | #endif //SOFT_I2C_H | ||||||
							
								
								
									
										19
									
								
								inc/tmp112.h
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								inc/tmp112.h
									
									
									
									
									
								
							| @@ -7,16 +7,23 @@ | |||||||
|  |  | ||||||
| #include "gd32e23x_it.h" | #include "gd32e23x_it.h" | ||||||
| #include "gd32e23x.h" | #include "gd32e23x.h" | ||||||
| #include "systick.h" |  | ||||||
| #include <stdbool.h> | #include "board_config.h" | ||||||
| #include <string.h> |  | ||||||
| #include <stdio.h> | #ifdef SOFTWARE_IIC | ||||||
| #include <stdlib.h> | #include "soft_i2c.h" | ||||||
| #include <math.h> | #else | ||||||
| #include "i2c.h" | #include "i2c.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
| #define TMP112A_ADDR         (0x49 << 1) | #define TMP112A_ADDR         (0x49 << 1) | ||||||
|  |  | ||||||
|  | /******************************************************************************/ | ||||||
|  |  | ||||||
|  | #define TMP112A_TEMP_REG     0x00 | ||||||
|  |  | ||||||
| uint32_t tmp112a_get_raw_channel_result(void); | uint32_t tmp112a_get_raw_channel_result(void); | ||||||
|  |  | ||||||
| #endif //TMP112_H | #endif //TMP112_H | ||||||
|   | |||||||
| @@ -45,9 +45,9 @@ | |||||||
|  |  | ||||||
| /* select a system clock by uncommenting the following line */ | /* select a system clock by uncommenting the following line */ | ||||||
| //#define __SYSTEM_CLOCK_8M_HXTAL              (__HXTAL) | //#define __SYSTEM_CLOCK_8M_HXTAL              (__HXTAL) | ||||||
| #define __SYSTEM_CLOCK_8M_IRC8M              (__IRC8M) | // #define __SYSTEM_CLOCK_8M_IRC8M              (__IRC8M) | ||||||
| // #define __SYSTEM_CLOCK_72M_PLL_HXTAL         (uint32_t)(72000000) | // #define __SYSTEM_CLOCK_72M_PLL_HXTAL         (uint32_t)(72000000) | ||||||
| // #define __SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2    (uint32_t)(72000000) | #define __SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2    (uint32_t)(72000000) | ||||||
|  |  | ||||||
| #define RCU_MODIFY(__delay)     do{                                     \ | #define RCU_MODIFY(__delay)     do{                                     \ | ||||||
|                                     volatile uint32_t i;                \ |                                     volatile uint32_t i;                \ | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								src/fwdgt.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/fwdgt.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | // | ||||||
|  | // Created by yelv1 on 24-12-29. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #include "fwdgt.h" | ||||||
|  |  | ||||||
|  | void watchdog_init(void) { | ||||||
|  |     /* Enable the LSI clock */ | ||||||
|  |     rcu_osci_on(RCU_IRC40K); | ||||||
|  |     rcu_osci_stab_wait(RCU_IRC40K); | ||||||
|  |  | ||||||
|  |     /* Configure FWDGT counter clock: 40KHz(IRC40K) / 64 = 0.625 KHz */ | ||||||
|  |     fwdgt_config(625, FWDGT_PSC_DIV64); // Set timeout to 1 seconds (625 / 0.625 KHz) | ||||||
|  |  | ||||||
|  |     /* Enable FWDGT */ | ||||||
|  |     fwdgt_enable(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void fwdgt_reset_mcu(void) { | ||||||
|  |     /* Enable the write access to the FWDGT_CTL register */ | ||||||
|  |     FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; | ||||||
|  |  | ||||||
|  |     /* Configure FWDGT to trigger a system reset */ | ||||||
|  |     fwdgt_config(50, FWDGT_PSC_DIV4); | ||||||
|  |  | ||||||
|  |     /* Reload the counter to trigger the reset */ | ||||||
|  |     fwdgt_counter_reload(); | ||||||
|  | } | ||||||
| @@ -39,8 +39,7 @@ OF SUCH DAMAGE. | |||||||
| #include "rs485.h" | #include "rs485.h" | ||||||
| #include "led.h" | #include "led.h" | ||||||
|  |  | ||||||
| char rx_buffer[RX_BUFFER_SIZE]; | extern uint8_t readBuffer[16]; | ||||||
| uint8_t rx_index = 0; |  | ||||||
|  |  | ||||||
| /*! | /*! | ||||||
|     \brief      this function handles NMI exception |     \brief      this function handles NMI exception | ||||||
| @@ -48,8 +47,7 @@ uint8_t rx_index = 0; | |||||||
|     \param[out] none |     \param[out] none | ||||||
|     \retval     none |     \retval     none | ||||||
| */ | */ | ||||||
| void NMI_Handler(void) | void NMI_Handler(void) { | ||||||
| { |  | ||||||
|     /* if NMI exception occurs, go to infinite loop */ |     /* if NMI exception occurs, go to infinite loop */ | ||||||
|     while (1) { |     while (1) { | ||||||
|     } |     } | ||||||
| @@ -61,8 +59,7 @@ void NMI_Handler(void) | |||||||
|     \param[out] none |     \param[out] none | ||||||
|     \retval     none |     \retval     none | ||||||
| */ | */ | ||||||
| void HardFault_Handler(void) | void HardFault_Handler(void) { | ||||||
| { |  | ||||||
|     /* if Hard Fault exception occurs, go to infinite loop */ |     /* if Hard Fault exception occurs, go to infinite loop */ | ||||||
|     while (1) { |     while (1) { | ||||||
|     } |     } | ||||||
| @@ -74,8 +71,7 @@ void HardFault_Handler(void) | |||||||
|     \param[out] none |     \param[out] none | ||||||
|     \retval     none |     \retval     none | ||||||
| */ | */ | ||||||
| void SVC_Handler(void) | void SVC_Handler(void) { | ||||||
| { |  | ||||||
|     /* if SVC exception occurs, go to infinite loop */ |     /* if SVC exception occurs, go to infinite loop */ | ||||||
|     while (1) { |     while (1) { | ||||||
|     } |     } | ||||||
| @@ -87,8 +83,7 @@ void SVC_Handler(void) | |||||||
|     \param[out] none |     \param[out] none | ||||||
|     \retval     none |     \retval     none | ||||||
| */ | */ | ||||||
| void PendSV_Handler(void) | void PendSV_Handler(void) { | ||||||
| { |  | ||||||
|     /* if PendSV exception occurs, go to infinite loop */ |     /* if PendSV exception occurs, go to infinite loop */ | ||||||
|     while (1) { |     while (1) { | ||||||
|     } |     } | ||||||
| @@ -100,8 +95,7 @@ void PendSV_Handler(void) | |||||||
|     \param[out] none |     \param[out] none | ||||||
|     \retval     none |     \retval     none | ||||||
| */ | */ | ||||||
| void SysTick_Handler(void) | void SysTick_Handler(void) { | ||||||
| { |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -111,38 +105,39 @@ void SysTick_Handler(void) | |||||||
|   * @retval None |   * @retval None | ||||||
|   */ |   */ | ||||||
| void TIMER16_IRQHandler(void) { | void TIMER16_IRQHandler(void) { | ||||||
|     if (timer_interrupt_flag_get(LED_TIMER, TIMER_INT_FLAG_UP) == SET) |     if (timer_interrupt_flag_get(LED_BLINK_TIMER, TIMER_INT_FLAG_UP) == SET) { | ||||||
|     { |         timer_interrupt_flag_clear(LED_BLINK_TIMER, TIMER_INT_FLAG_UP); | ||||||
|         timer_interrupt_flag_clear(LED_TIMER, TIMER_INT_FLAG_UP); |  | ||||||
|         static uint8_t led_status = 0; |         static uint8_t led_status = 0; | ||||||
|         if (led_status) |         if (led_status) { | ||||||
|         { |  | ||||||
|             gpio_bit_write(LED_PORT, LED_PIN, RESET); |             gpio_bit_write(LED_PORT, LED_PIN, RESET); | ||||||
|             timer_autoreload_value_config(LED_TIMER, 19200); |             timer_autoreload_value_config(LED_BLINK_TIMER, 19200); | ||||||
|         } else { |         } else { | ||||||
|             gpio_bit_write(LED_PORT, LED_PIN, SET); |             gpio_bit_write(LED_PORT, LED_PIN, SET); | ||||||
|             timer_autoreload_value_config(LED_TIMER, 800); |             timer_autoreload_value_config(LED_BLINK_TIMER, 800); | ||||||
|         } |         } | ||||||
|         led_status = !led_status; |         led_status = !led_status; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void USART0_IRQHandler(void) { | void USART0_IRQHandler(void) { | ||||||
|     if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) |     static uint8_t rx_index = 0; | ||||||
|     { |  | ||||||
|         usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE); |     if (RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) { | ||||||
|         uint8_t received_data = (uint8_t)usart_data_receive(USART0); |         // usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE); | ||||||
|  |         // uint8_t received_data = (uint8_t) usart_data_receive(USART0); | ||||||
|  |  | ||||||
|         // 将接收到的数据存储到缓冲区 |         // 将接收到的数据存储到缓冲区 | ||||||
|         if(rx_index < RX_BUFFER_SIZE - 1) { |         if (rx_index < sizeof(readBuffer) - 1) { | ||||||
|             rx_buffer[rx_index++] = received_data; |             readBuffer[rx_index++] = usart_data_receive(USART0); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|         // 检查是否接收到换行符,表示指令结束 |     if (RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)) { | ||||||
|         if(received_data == '\n') { |         usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE); | ||||||
|             rx_buffer[rx_index] = '\0'; // 添加字符串结束符 |  | ||||||
|             process_command(rx_buffer); // 处理指令 |         Command_Write(readBuffer, rx_index);// 处理指令 | ||||||
|  |  | ||||||
|         rx_index = 0; // 重置缓冲区索引 |         rx_index = 0; // 重置缓冲区索引 | ||||||
|         } |         return; | ||||||
|     } |     } | ||||||
| } | } | ||||||
							
								
								
									
										36
									
								
								src/i2c.c
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								src/i2c.c
									
									
									
									
									
								
							| @@ -32,6 +32,8 @@ void i2c_gpio_config(void) { | |||||||
|     \retval     none |     \retval     none | ||||||
| */ | */ | ||||||
| void i2c_config(void) { | void i2c_config(void) { | ||||||
|  |     /* configure I2C GPIO */ | ||||||
|  |     i2c_gpio_config(); | ||||||
|     /* enable I2C clock */ |     /* enable I2C clock */ | ||||||
|     rcu_periph_clock_enable(RCU_I2C); |     rcu_periph_clock_enable(RCU_I2C); | ||||||
|     /* configure I2C clock */ |     /* configure I2C clock */ | ||||||
| @@ -158,7 +160,9 @@ uint8_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) | |||||||
|                 } else { |                 } else { | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c bus is busy in WRITE BYTE!\n"); |                     printf("i2c bus is busy in WRITE BYTE!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case I2C_SEND_ADDRESS: |             case I2C_SEND_ADDRESS: | ||||||
| @@ -173,7 +177,9 @@ uint8_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) | |||||||
|                 } else { |                 } else { | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master sends start signal timeout in WRITE BYTE!\n"); |                     printf("i2c master sends start signal timeout in WRITE BYTE!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case I2C_CLEAR_ADDRESS_FLAG: |             case I2C_CLEAR_ADDRESS_FLAG: | ||||||
| @@ -188,7 +194,9 @@ uint8_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) | |||||||
|                 } else { |                 } else { | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master clears address flag timeout in WRITE BYTE!\n"); |                     printf("i2c master clears address flag timeout in WRITE BYTE!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case I2C_TRANSMIT_DATA: |             case I2C_TRANSMIT_DATA: | ||||||
| @@ -203,7 +211,9 @@ uint8_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) | |||||||
|                 } else { |                 } else { | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master sends data timeout in WRITE BYTE!\n"); |                     printf("i2c master sends data timeout in WRITE BYTE!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             /* wait until BTC bit is set */ |             /* wait until BTC bit is set */ | ||||||
| @@ -217,7 +227,9 @@ uint8_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) | |||||||
|                 } else { |                 } else { | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master sends MSB data timeout in WRITE BYTE!\n"); |                     printf("i2c master sends MSB data timeout in WRITE BYTE!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             /* wait until BTC bit is set */ |             /* wait until BTC bit is set */ | ||||||
| @@ -232,7 +244,9 @@ uint8_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) | |||||||
|                 } else { |                 } else { | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master sends LSB data timeout in WRITE BYTE!\n"); |                     printf("i2c master sends LSB data timeout in WRITE BYTE!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             /* wait until BTC bit is set */ |             /* wait until BTC bit is set */ | ||||||
| @@ -245,7 +259,9 @@ uint8_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) | |||||||
|                 } else { |                 } else { | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master sends data timeout in WRITE BYTE!\n"); |                     printf("i2c master sends data timeout in WRITE BYTE!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case I2C_STOP: |             case I2C_STOP: | ||||||
| @@ -262,14 +278,18 @@ uint8_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) | |||||||
|                 } else { |                 } else { | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master sends stop signal timeout in WRITE BYTE!\n"); |                     printf("i2c master sends stop signal timeout in WRITE BYTE!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             default: |             default: | ||||||
|                 state = I2C_START; |                 state = I2C_START; | ||||||
|                 i2c_timeout_flag = I2C_OK; |                 i2c_timeout_flag = I2C_OK; | ||||||
|                 timeout = 0; |                 timeout = 0; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                 printf("i2c master sends start signal in WRITE BYTE.\n"); |                 printf("i2c master sends start signal in WRITE BYTE.\n"); | ||||||
|  | #endif | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -301,7 +321,9 @@ uint8_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) { | |||||||
|                         // i2c_bus_reset(); |                         // i2c_bus_reset(); | ||||||
|                         timeout = 0; |                         timeout = 0; | ||||||
|                         state = I2C_START; |                         state = I2C_START; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                         printf("i2c bus is busy in READ!\n"); |                         printf("i2c bus is busy in READ!\n"); | ||||||
|  | #endif | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             /* send the start signal */ |             /* send the start signal */ | ||||||
| @@ -328,7 +350,9 @@ uint8_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) { | |||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|                     read_cycle = RESET; |                     read_cycle = RESET; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master sends start signal timeout in READ!\n"); |                     printf("i2c master sends start signal timeout in READ!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case I2C_CLEAR_ADDRESS_FLAG: |             case I2C_CLEAR_ADDRESS_FLAG: | ||||||
| @@ -348,7 +372,9 @@ uint8_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) { | |||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|                     read_cycle = RESET; |                     read_cycle = RESET; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master clears address flag timeout in READ!\n"); |                     printf("i2c master clears address flag timeout in READ!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case I2C_TRANSMIT_DATA: |             case I2C_TRANSMIT_DATA: | ||||||
| @@ -365,7 +391,9 @@ uint8_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) { | |||||||
|                         timeout = 0; |                         timeout = 0; | ||||||
|                         state = I2C_START; |                         state = I2C_START; | ||||||
|                         read_cycle = RESET; |                         read_cycle = RESET; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                         printf("i2c master wait data buffer is empty timeout in READ!\n"); |                         printf("i2c master wait data buffer is empty timeout in READ!\n"); | ||||||
|  | #endif | ||||||
|                     } |                     } | ||||||
|                     /* wait until BTC bit is set */ |                     /* wait until BTC bit is set */ | ||||||
|                     while ((!i2c_flag_get(I2C0, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)) { |                     while ((!i2c_flag_get(I2C0, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)) { | ||||||
| @@ -379,7 +407,9 @@ uint8_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) { | |||||||
|                         timeout = 0; |                         timeout = 0; | ||||||
|                         state = I2C_START; |                         state = I2C_START; | ||||||
|                         read_cycle = RESET; |                         read_cycle = RESET; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                         printf("i2c master sends register address timeout in READ!\n"); |                         printf("i2c master sends register address timeout in READ!\n"); | ||||||
|  | #endif | ||||||
|                     } |                     } | ||||||
|                 } else { |                 } else { | ||||||
|                     while (number_of_byte) { |                     while (number_of_byte) { | ||||||
| @@ -404,7 +434,9 @@ uint8_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) { | |||||||
|                             timeout = 0; |                             timeout = 0; | ||||||
|                             state = I2C_START; |                             state = I2C_START; | ||||||
|                             read_cycle = 0; |                             read_cycle = 0; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                             printf("i2c master sends data timeout in READ!\n"); |                             printf("i2c master sends data timeout in READ!\n"); | ||||||
|  | #endif | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
| @@ -424,7 +456,9 @@ uint8_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) { | |||||||
|                     timeout = 0; |                     timeout = 0; | ||||||
|                     state = I2C_START; |                     state = I2C_START; | ||||||
|                     read_cycle = 0; |                     read_cycle = 0; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                     printf("i2c master sends stop signal timeout in READ!\n"); |                     printf("i2c master sends stop signal timeout in READ!\n"); | ||||||
|  | #endif | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             default: |             default: | ||||||
| @@ -432,7 +466,9 @@ uint8_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) { | |||||||
|                 read_cycle = 0; |                 read_cycle = 0; | ||||||
|                 i2c_timeout_flag = I2C_OK; |                 i2c_timeout_flag = I2C_OK; | ||||||
|                 timeout = 0; |                 timeout = 0; | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|                 printf("i2c master sends start signal in READ.\n"); |                 printf("i2c master sends start signal in READ.\n"); | ||||||
|  | #endif | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										112
									
								
								src/ldc1612.c
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								src/ldc1612.c
									
									
									
									
									
								
							| @@ -12,7 +12,12 @@ void ldc1612_set_conversion_time(uint8_t channel, uint16_t result) { | |||||||
|     uint8_t data[2] = {0}; |     uint8_t data[2] = {0}; | ||||||
|     data[0] = (result >> 8) & 0xFF; |     data[0] = (result >> 8) & 0xFF; | ||||||
|     data[1] = result & 0xFF; |     data[1] = result & 0xFF; | ||||||
|     i2c_read_16bits(LDC1612_ADDR, SET_CONVERSION_TIME_REG_START + channel, data); |  | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_write_16bits(LDC1612_ADDR, SET_CONVERSION_TIME_REG_START + channel, data); | ||||||
|  | #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, SET_CONVERSION_TIME_REG_START + channel, data); | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @brief set conversion offset. | /** @brief set conversion offset. | ||||||
| @@ -23,7 +28,12 @@ void ldc1612_set_conversion_offset(uint8_t channel, uint16_t result) { | |||||||
|     uint8_t data[2] = {0}; |     uint8_t data[2] = {0}; | ||||||
|     data[0] = (result >> 8) & 0xFF; |     data[0] = (result >> 8) & 0xFF; | ||||||
|     data[1] = result & 0xFF; |     data[1] = result & 0xFF; | ||||||
|     i2c_read_16bits(LDC1612_ADDR, SET_CONVERSION_OFFSET_REG_START + channel, data); | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_write_16bits(LDC1612_ADDR, SET_CONVERSION_OFFSET_REG_START + channel, data); | ||||||
|  | #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, SET_CONVERSION_OFFSET_REG_START + channel, data); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @brief Before conversion,wait LC sensor stabilize for a short time. | /** @brief Before conversion,wait LC sensor stabilize for a short time. | ||||||
| @@ -34,7 +44,11 @@ void ldc1612_set_LC_stabilize_time(uint8_t channel, uint16_t result) { | |||||||
|     uint8_t data[2] = {0}; |     uint8_t data[2] = {0}; | ||||||
|     data[0] = (result >> 8) & 0xFF; |     data[0] = (result >> 8) & 0xFF; | ||||||
|     data[1] = result & 0xFF; |     data[1] = result & 0xFF; | ||||||
|     i2c_read_16bits(LDC1612_ADDR, SET_LC_STABILIZE_REG_START + channel, data); | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_write_16bits(LDC1612_ADDR, SET_LC_STABILIZE_REG_START + channel, data); | ||||||
|  | #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, SET_LC_STABILIZE_REG_START + channel, data); | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @brief set input frequency divide and fref divide. | /** @brief set input frequency divide and fref divide. | ||||||
| @@ -65,8 +79,11 @@ void ldc1612_set_freq_divide(uint8_t channel) { | |||||||
|     data[0] = (value >> 8) & 0xFF; |     data[0] = (value >> 8) & 0xFF; | ||||||
|     data[1] = value & 0xFF; |     data[1] = value & 0xFF; | ||||||
|     // printf("\tFIN_DIV: %d, FREF_DIV: %d\r\n", fin_div, freq_div); |     // printf("\tFIN_DIV: %d, FREF_DIV: %d\r\n", fin_div, freq_div); | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|     i2c_read_16bits(LDC1612_ADDR, SET_FREQ_REG_START + channel, data); |     soft_i2c_write_16bits(LDC1612_ADDR, SET_FREQ_REG_START + channel, data); | ||||||
|  | #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, SET_FREQ_REG_START + channel, data); | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @brief Error output config. | /** @brief Error output config. | ||||||
| @@ -77,7 +94,11 @@ void ldc1612_set_error_config(uint16_t value) { | |||||||
|     data[0] = (value >> 8) & 0xFF; |     data[0] = (value >> 8) & 0xFF; | ||||||
|     data[1] = value & 0xFF; |     data[1] = value & 0xFF; | ||||||
|  |  | ||||||
|     i2c_read_16bits(LDC1612_ADDR, ERROR_CONFIG_REG, data); | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_write_16bits(LDC1612_ADDR, ERROR_CONFIG_REG, data); | ||||||
|  | #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, ERROR_CONFIG_REG, data); | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @brief mux  config. | /** @brief mux  config. | ||||||
| @@ -88,7 +109,11 @@ void ldc1612_set_mux_config(uint16_t value) { | |||||||
|     data[0] = (value >> 8) & 0xFF; |     data[0] = (value >> 8) & 0xFF; | ||||||
|     data[1] = value & 0xFF; |     data[1] = value & 0xFF; | ||||||
|  |  | ||||||
|     i2c_read_16bits(LDC1612_ADDR, MUL_CONFIG_REG, data); |     #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_write_16bits(LDC1612_ADDR, MUL_CONFIG_REG, data); | ||||||
|  |     #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, MUL_CONFIG_REG, data); | ||||||
|  |     #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @brief reset sensor. | /** @brief reset sensor. | ||||||
| @@ -98,7 +123,12 @@ void ldc1612_reset_sensor(void) { | |||||||
|     uint8_t data[2] = {0}; |     uint8_t data[2] = {0}; | ||||||
|     data[0] = 0x80; |     data[0] = 0x80; | ||||||
|     data[1] = 0x00; |     data[1] = 0x00; | ||||||
|     i2c_read_16bits(LDC1612_ADDR, SENSOR_RESET_REG, data); |  | ||||||
|  |     #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_write_16bits(LDC1612_ADDR, SENSOR_RESET_REG, data); | ||||||
|  |     #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, SENSOR_RESET_REG, data); | ||||||
|  |     #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @brief set drive current of sensor. | /** @brief set drive current of sensor. | ||||||
| @@ -109,7 +139,11 @@ void ldc1612_set_drive_current(uint8_t channel, uint16_t value) { | |||||||
|     data[0] = (value >> 8) & 0xFF; |     data[0] = (value >> 8) & 0xFF; | ||||||
|     data[1] = value & 0xFF; |     data[1] = value & 0xFF; | ||||||
|  |  | ||||||
|     i2c_read_16bits(LDC1612_ADDR, SET_DRIVER_CURRENT_REG + channel, data); |     #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_write_16bits(LDC1612_ADDR, SET_DRIVER_CURRENT_REG + channel, data); | ||||||
|  |     #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, SET_DRIVER_CURRENT_REG + channel, data); | ||||||
|  |     #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @brief Main config part of sensor.Contains select channel、start conversion、sleep mode、sensor activation mode、INT pin disable .. | /** @brief Main config part of sensor.Contains select channel、start conversion、sleep mode、sensor activation mode、INT pin disable .. | ||||||
| @@ -120,7 +154,11 @@ void ldc1612_set_sensor_config(uint16_t value) { | |||||||
|     data[0] = (value >> 8) & 0xFF; |     data[0] = (value >> 8) & 0xFF; | ||||||
|     data[1] = value & 0xFF; |     data[1] = value & 0xFF; | ||||||
|  |  | ||||||
|     i2c_read_16bits(LDC1612_ADDR, SENSOR_CONFIG_REG, data); |     #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_write_16bits(LDC1612_ADDR, SENSOR_CONFIG_REG, data); | ||||||
|  |     #else | ||||||
|  |     i2c_write_16bits(LDC1612_ADDR, SENSOR_CONFIG_REG, data); | ||||||
|  |     #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void ldc1612_single_ch0_config(void) { | void ldc1612_single_ch0_config(void) { | ||||||
| @@ -141,23 +179,41 @@ void ldc1612_single_ch0_config(void) { | |||||||
|  |  | ||||||
| void ldc1612_iic_get_sensor_infomation(void) { | void ldc1612_iic_get_sensor_infomation(void) { | ||||||
|     uint8_t data[2] = {0}; |     uint8_t data[2] = {0}; | ||||||
|     // ldc1612_iic_read_16bits(READ_MANUFACTURER_ID, data); |  | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data); | ||||||
|  | #else | ||||||
|     i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data); |     i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data); | ||||||
|     printf("\tManufacturer: 0x%x\r\n", (data[0] << 8) | data[1]); | #endif | ||||||
|     // ldc1612_iic_read_16bits(READ_DEVICE_ID, data); |     printf("\tManufacturer: 0x%x", (data[0] << 8) | data[1]); | ||||||
|  |  | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data); | ||||||
|  | #else | ||||||
|     i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data); |     i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data); | ||||||
|     printf("\tDevice: 0x%x\r\n", (data[0] << 8) | data[1]); | #endif | ||||||
|  |     printf("\tDevice: 0x%x", (data[0] << 8) | data[1]); | ||||||
| } | } | ||||||
|  |  | ||||||
| uint16_t ldc1612_get_manufacturer_id(void) { | uint16_t ldc1612_get_manufacturer_id(void) { | ||||||
|     uint8_t data[2] = {0}; |     uint8_t data[2] = {0}; | ||||||
|  |  | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data); | ||||||
|  | #else | ||||||
|     i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data); |     i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data); | ||||||
|  | #endif | ||||||
|     return (data[0] << 8) | data[1]; |     return (data[0] << 8) | data[1]; | ||||||
| } | } | ||||||
|  |  | ||||||
| uint16_t ldc1612_get_deveice_id(void) { | uint16_t ldc1612_get_deveice_id(void) { | ||||||
|     uint8_t data[2] = {0}; |     uint8_t data[2] = {0}; | ||||||
|  |  | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data); | ||||||
|  | #else | ||||||
|     i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data); |     i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data); | ||||||
|  | #endif | ||||||
|     return (data[0] << 8) | data[1]; |     return (data[0] << 8) | data[1]; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -169,11 +225,18 @@ uint32_t ldc1612_get_raw_channel_result(uint8_t channel) { | |||||||
|     uint32_t raw_value = 0; |     uint32_t raw_value = 0; | ||||||
|     uint8_t value[2] = {0}; |     uint8_t value[2] = {0}; | ||||||
|  |  | ||||||
|     // ldc1612_iic_read_16bits(CONVERTION_RESULT_REG_START + channel, value); | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel, value); | ||||||
|  | #else | ||||||
|     i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel, value); |     i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel, value); | ||||||
|  | #endif | ||||||
|     raw_value |= (uint32_t) ((value[0] << 8) | value[1]) << 16; |     raw_value |= (uint32_t) ((value[0] << 8) | value[1]) << 16; | ||||||
|     // ldc1612_iic_read_16bits(CONVERTION_RESULT_REG_START + channel + 1, value); |  | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel + 1, value); | ||||||
|  | #else | ||||||
|     i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel + 1, value); |     i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel + 1, value); | ||||||
|  | #endif | ||||||
|     raw_value |= (uint32_t) ((value[0] << 8) | value[1]); |     raw_value |= (uint32_t) ((value[0] << 8) | value[1]); | ||||||
|     return ldc1612_parse_raw_result(raw_value); |     return ldc1612_parse_raw_result(raw_value); | ||||||
| } | } | ||||||
| @@ -213,3 +276,20 @@ uint32_t ldc1612_parse_raw_result(uint32_t raw_result) { | |||||||
|  |  | ||||||
|     return raw_result; |     return raw_result; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void ldc1612_drvie_current_detect(uint8_t channel) { | ||||||
|  |     uint8_t data[2] = {0}; | ||||||
|  |     uint16_t init_value = 0 , drive_current = 0; | ||||||
|  |  | ||||||
|  |     ldc1612_set_sensor_config(LDC1612_SLEEP_MODE); | ||||||
|  |     ldc1612_set_freq_divide(channel); | ||||||
|  |     soft_i2c_read_16bits(LDC1612_ADDR, SENSOR_CONFIG_REG, data); | ||||||
|  |     ldc1612_set_sensor_config(LDC1612_SLEEP_MODE); | ||||||
|  |     ldc1612_set_sensor_config(LDC1612_SENSOR_CONFIG); //0x1A --0x1601 | ||||||
|  |     delay_ms(10); | ||||||
|  |     soft_i2c_read_16bits(LDC1612_ADDR, SET_DRIVER_CURRENT_REG, data); | ||||||
|  |  | ||||||
|  |     init_value = (((data[0] << 8) | data[1]) >> 6) & 0x1F; | ||||||
|  |     drive_current = (init_value << 11) | 0x0000; | ||||||
|  |     printf("init value: 0x%x\tdrive current: 0x%x\n", init_value, drive_current); | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								src/led.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								src/led.c
									
									
									
									
									
								
							| @@ -11,22 +11,22 @@ void led_config(void) { | |||||||
|     gpio_output_options_set(LED_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_PIN); |     gpio_output_options_set(LED_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_PIN); | ||||||
|     gpio_bit_write(LED_PORT, LED_PIN, SET); |     gpio_bit_write(LED_PORT, LED_PIN, SET); | ||||||
|  |  | ||||||
|     rcu_periph_clock_enable(LED_TIMER_RCU); |     rcu_periph_clock_enable(LED_BLINK_TIMER_RCU); | ||||||
|     timer_deinit(LED_TIMER); |     timer_deinit(LED_BLINK_TIMER); | ||||||
|  |  | ||||||
|     timer_parameter_struct timer_initpara; |     timer_parameter_struct timer_initpara; | ||||||
|     timer_struct_para_init(&timer_initpara); |     timer_struct_para_init(&timer_initpara); | ||||||
|     timer_initpara.prescaler = 799; |     timer_initpara.prescaler = 7199; | ||||||
|     timer_initpara.alignedmode = TIMER_COUNTER_EDGE; |     timer_initpara.alignedmode = TIMER_COUNTER_EDGE; | ||||||
|     timer_initpara.counterdirection = TIMER_COUNTER_UP; |     timer_initpara.counterdirection = TIMER_COUNTER_UP; | ||||||
|     timer_initpara.period = 999; |     timer_initpara.period = 9999; | ||||||
|     timer_initpara.clockdivision = TIMER_CKDIV_DIV1; |     timer_initpara.clockdivision = TIMER_CKDIV_DIV1; | ||||||
|     timer_init(LED_TIMER, &timer_initpara); |     timer_init(LED_BLINK_TIMER, &timer_initpara); | ||||||
|  |  | ||||||
|     timer_auto_reload_shadow_enable(LED_TIMER); |     timer_auto_reload_shadow_enable(LED_BLINK_TIMER); | ||||||
|     timer_interrupt_enable(LED_TIMER, TIMER_INT_UP); |     timer_interrupt_enable(LED_BLINK_TIMER, TIMER_INT_UP); | ||||||
|  |  | ||||||
|     timer_enable(LED_TIMER); |     timer_enable(LED_BLINK_TIMER); | ||||||
|  |  | ||||||
|     nvic_irq_enable(LED_IRQ, 2); |     nvic_irq_enable(LED_BLINK_IRQ, 3U); | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										52
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -5,18 +5,10 @@ | |||||||
|     \version 2024-02-22, V2.1.0, firmware for GD32E23x |     \version 2024-02-22, V2.1.0, firmware for GD32E23x | ||||||
| */ | */ | ||||||
| #include "main.h" | #include "main.h" | ||||||
| #include <stdio.h> |  | ||||||
| #include "gd32e23x.h" |  | ||||||
| #include "systick.h" |  | ||||||
| #include "gd32e23x_libopt.h" |  | ||||||
| #include "rs485.h" |  | ||||||
| #include "led.h" |  | ||||||
| #include "i2c.h" |  | ||||||
| #include "ldc1612.h" |  | ||||||
| #include "tmp112.h" |  | ||||||
|  |  | ||||||
| uint32_t g_temperature_uint32; | bool g_statusSwitch = false; | ||||||
| uint32_t g_eddy_current_value_uint32; |  | ||||||
|  | uint8_t readBuffer[16]; | ||||||
|  |  | ||||||
| /*! | /*! | ||||||
|     \brief      main function |     \brief      main function | ||||||
| @@ -25,26 +17,48 @@ uint32_t g_eddy_current_value_uint32; | |||||||
|     \retval     none |     \retval     none | ||||||
| */ | */ | ||||||
| int main(void) { | int main(void) { | ||||||
|  |     setbuf(stdout, NULL); | ||||||
|     /* configure systick */ |     /* configure systick */ | ||||||
|     systick_config(); |     systick_config(); | ||||||
|     /* configure USART */ |     /* configure USART */ | ||||||
|     rs485_config(); |     rs485_config(); | ||||||
|     /* configure LED */ |     /* configure LED */ | ||||||
|     led_config(); |     led_config(); | ||||||
|     /* configure I2C */ |  | ||||||
|     i2c_gpio_config(); |  | ||||||
|     i2c_config(); |  | ||||||
|  |  | ||||||
|  |     /* configure I2C */ | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_config(); | ||||||
|  | #else | ||||||
|  |     i2c_config(); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef DEBUG_VERBOES | ||||||
|     ldc1612_iic_get_sensor_infomation(); |     ldc1612_iic_get_sensor_infomation(); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|     /* configure LDC1612 */ |     /* configure LDC1612 */ | ||||||
|     ldc1612_single_ch0_config(); |     ldc1612_single_ch0_config(); | ||||||
|  |  | ||||||
|  |     /* Initialize watchdog */ | ||||||
|  |     watchdog_init(); | ||||||
|  |  | ||||||
|  |     uint8_t command[10]; | ||||||
|  |     uint8_t command_length = 0; | ||||||
|  |  | ||||||
|     while (1) { |     while (1) { | ||||||
|         delay_ms(500); |  | ||||||
|         g_eddy_current_value_uint32 = 0; |         // delay_ms(10); | ||||||
|         g_temperature_uint32 = 0; |         fwdgt_counter_reload(); | ||||||
|         g_eddy_current_value_uint32 = ldc1612_get_raw_channel_result(CHANNEL_0); |         command_length = Command_GetCommand(command); | ||||||
|         g_temperature_uint32 = tmp112a_get_raw_channel_result(); |         if (command_length != 0) | ||||||
|  |         { | ||||||
|  |             for (int i = 0; i < command_length; i++) | ||||||
|  |             { | ||||||
|  |                 printf("%c", command[i]); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         // if (g_statusSwitch) | ||||||
|  |         // {eddy_current_value_report();} | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,63 +0,0 @@ | |||||||
| // |  | ||||||
| // Created by yelv1 on 24-9-22. |  | ||||||
| // |  | ||||||
| #include "peripheral.h" |  | ||||||
| #include "gd32e23x.h" |  | ||||||
|  |  | ||||||
| void usart_config(void) |  | ||||||
| { |  | ||||||
|     rcu_periph_clock_enable(RCU_GPIOA); |  | ||||||
|     rcu_periph_clock_enable(RCU_USART0); |  | ||||||
|  |  | ||||||
|     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); |  | ||||||
|     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); |  | ||||||
|  |  | ||||||
|     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3); |  | ||||||
|     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3); |  | ||||||
|     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2); |  | ||||||
|     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2); |  | ||||||
|  |  | ||||||
|     usart_deinit(USART0); |  | ||||||
|     usart_baudrate_set(USART0, 115200U); |  | ||||||
|     usart_receive_config(USART0, USART_RECEIVE_ENABLE); |  | ||||||
|     usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); |  | ||||||
|  |  | ||||||
|     usart_enable(USART0); |  | ||||||
|  |  | ||||||
|     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4); |  | ||||||
|     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4); |  | ||||||
|  |  | ||||||
|     gpio_bit_write(GPIOA, GPIO_PIN_4, SET); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /*! |  | ||||||
|     \brief      led blink configuration |  | ||||||
|     \param[in]  none |  | ||||||
|     \param[out] none |  | ||||||
|     \retval     none |  | ||||||
| */ |  | ||||||
| void led_blink_config(void) |  | ||||||
| { |  | ||||||
|     rcu_periph_clock_enable(RCU_GPIOB); |  | ||||||
|  |  | ||||||
|     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1); |  | ||||||
|     gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_1); |  | ||||||
|     gpio_bit_write(GPIOB, GPIO_PIN_1, SET); |  | ||||||
|  |  | ||||||
|     rcu_periph_clock_enable(RCU_TIMER13); |  | ||||||
|     timer_deinit(RCU_TIMER13); |  | ||||||
|  |  | ||||||
|     timer_parameter_struct timer_initpara; |  | ||||||
|     timer_struct_para_init(&timer_initpara); |  | ||||||
|     timer_initpara.prescaler        =7199; |  | ||||||
|     timer_initpara.alignedmode      =TIMER_COUNTER_EDGE; |  | ||||||
|     timer_initpara.counterdirection =TIMER_COUNTER_UP; |  | ||||||
|     timer_initpara.period           =999; |  | ||||||
|     timer_initpara.clockdivision    =TIMER_CKDIV_DIV1; |  | ||||||
|     timer_init(TIMER13, &timer_initpara); |  | ||||||
|  |  | ||||||
|     timer_auto_reload_shadow_enable(TIMER13); |  | ||||||
|     timer_interrupt_enable(TIMER13, TIMER_INT_UP); |  | ||||||
|     nvic_irq_enable(TIMER13_IRQn, 0); |  | ||||||
|     timer_enable(TIMER13); |  | ||||||
| } |  | ||||||
							
								
								
									
										190
									
								
								src/rs485.c
									
									
									
									
									
								
							
							
						
						
									
										190
									
								
								src/rs485.c
									
									
									
									
									
								
							| @@ -4,10 +4,49 @@ | |||||||
|  |  | ||||||
| #include "rs485.h" | #include "rs485.h" | ||||||
|  |  | ||||||
| extern uint32_t g_temperature_uint32; | uint8_t package_header[3] = {0xB5, 0xF0, 0x04}; | ||||||
| extern uint32_t g_eddy_current_value_uint32; | uint8_t package_data[4] = {0}; | ||||||
|  |  | ||||||
|  | extern bool g_statusSwitch; | ||||||
|  |  | ||||||
| void rs485_config(void) { | void rs485_config(void) { | ||||||
|  | #ifndef RS485_MAX13487 | ||||||
|  |     rcu_periph_clock_enable(RS485_GPIO_RCU); | ||||||
|  |     rcu_periph_clock_enable(RS485_RCU); | ||||||
|  |  | ||||||
|  |     gpio_af_set(RS485_GPIO_PORT, GPIO_AF_1, RS485_TX_PIN | RS485_RX_PIN | RS485_EN_PIN); | ||||||
|  |  | ||||||
|  |     /* configure USART Tx&Rx as alternate function push-pull */ | ||||||
|  |     gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, RS485_TX_PIN | RS485_RX_PIN); | ||||||
|  |     gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, RS485_TX_PIN | RS485_RX_PIN); | ||||||
|  |  | ||||||
|  |     /* configure RS485 EN Pin */ | ||||||
|  |     gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, RS485_EN_PIN); | ||||||
|  |     gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RS485_EN_PIN); | ||||||
|  |     // gpio_bit_write(RS485_GPIO_PORT, RS485_EN_PIN, SET); | ||||||
|  |  | ||||||
|  |     /* USART configure */ | ||||||
|  |     usart_deinit(RS485_PHY); | ||||||
|  |     usart_baudrate_set(RS485_PHY, RS485_BAUDRATE); | ||||||
|  |     // usart_parity_config(RS485_PHY, USART_PM_NONE); | ||||||
|  |     // usart_word_length_set(RS485_PHY, USART_WL_8BIT); | ||||||
|  |     // usart_stop_bit_set(RS485_PHY, USART_STB_1BIT); | ||||||
|  |     usart_receive_config(RS485_PHY, USART_RECEIVE_ENABLE); | ||||||
|  |     usart_transmit_config(RS485_PHY, USART_TRANSMIT_ENABLE); | ||||||
|  |  | ||||||
|  |     usart_driver_assertime_config(RS485_PHY, 0x01); | ||||||
|  |     usart_driver_deassertime_config(RS485_PHY, 0x01); | ||||||
|  |  | ||||||
|  |     // usart_depolarity_config(USART0, USART_DEP_HIGH); | ||||||
|  |     // usart_depolarity_config(USART0, USART_DEP_LOW); | ||||||
|  |  | ||||||
|  |     usart_rs485_driver_enable(RS485_PHY); | ||||||
|  |     usart_enable(RS485_PHY); | ||||||
|  |  | ||||||
|  |     nvic_irq_enable(USART0_IRQn, 0); | ||||||
|  |     usart_interrupt_enable(RS485_PHY, USART_INT_RBNE); | ||||||
|  |     usart_interrupt_enable(RS485_PHY, USART_INT_IDLE); | ||||||
|  | #else | ||||||
|     rcu_periph_clock_enable(RS485_GPIO_RCU); |     rcu_periph_clock_enable(RS485_GPIO_RCU); | ||||||
|     rcu_periph_clock_enable(RS485_RCU); |     rcu_periph_clock_enable(RS485_RCU); | ||||||
|  |  | ||||||
| @@ -32,39 +71,138 @@ void rs485_config(void) { | |||||||
|  |  | ||||||
|     nvic_irq_enable(USART0_IRQn, 0); |     nvic_irq_enable(USART0_IRQn, 0); | ||||||
|     usart_interrupt_enable(RS485_PHY, USART_INT_RBNE); |     usart_interrupt_enable(RS485_PHY, USART_INT_RBNE); | ||||||
|  |     usart_interrupt_enable(RS485_PHY, USART_INT_IDLE); | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void process_command(char *cmd) { | void process_command(uint8_t *cmd, size_t length) { | ||||||
|     if (strncmp(cmd, "M1", 2) == 0) { |     char combined_str[3]; | ||||||
|         // printf("M1 -=-=- OK!\r\n"); |     validation_result_t validate = VALIDATION_SUCCESS; | ||||||
|         printf("EddyCurrent: %lu\r\n", g_eddy_current_value_uint32); |  | ||||||
|     } else if (strncmp(cmd, "M2", 2) == 0) { |     validate = (validate_package_header(cmd) | | ||||||
|         // printf("M2 -=-=- OK!\r\n"); |                 validate_package_type(cmd) | | ||||||
|         printf("Temperature: %lu\r\n", g_temperature_uint32); |                 validate_data_length(cmd) | | ||||||
|         // } else if (strncmp(cmd, "M3", 2) == 0) { |                 validate_package_crc(cmd, length)); | ||||||
|         //     char *param_str = cmd + 2; // Skip "M3" |  | ||||||
|         //     int param = atoi(param_str + 1); // Skip "S" and convert to integer |     switch (validate) { | ||||||
|         //     if (param >= 0 && param <= 100) { |         case VALIDATION_SUCCESS: | ||||||
|         //         printf("M3 with parameter %d -=-=- OK!\r\n", param); |             // printf("%d", length); | ||||||
|         //     } else { |             sprintf(combined_str, "%c%c", cmd[3], cmd[4]); | ||||||
|         //         printf("Invalid parameter for M3 command!\r\n"); |             if (strcmp(combined_str, "M1") == 0) { | ||||||
|         //     } |                 g_statusSwitch = true; | ||||||
|  |             } else if (strcmp(combined_str, "M2") == 0) { | ||||||
|  |                 g_statusSwitch = false; | ||||||
|  |             } else if (strcmp(combined_str, "M3") == 0) { | ||||||
|  |                 printf("%c%c%c%c%c%c", 0xB5, 0xF0, 0x02, 0x6F, 0x6B, 0xCC); | ||||||
|  |                 fwdgt_reset_mcu(); | ||||||
|             } else { |             } else { | ||||||
|         printf("Invalid Command!\r\n"); |                 printf("%c%c%c%c%c%c%c", 0xB5, 0xF0, 0x03, 0x65, 0x72, 0x72, 0x3C); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |         case VALIDATION_CRC_ERROR: | ||||||
|  |             printf("%c%c%c%c%c%c%c", 0xB5, 0xF1, 0x03, 0x65, 0x72, 0x72, 0x3D); | ||||||
|  |             break; | ||||||
|  |         case VALIDATION_HEADER_ERROR: | ||||||
|  |             printf("%c%c%c%c%c%c%c", 0xB5, 0xF2, 0x03, 0x65, 0x72, 0x72, 0x3E); | ||||||
|  |             break; | ||||||
|  |         case VALIDATION_TYPE_ERROR: | ||||||
|  |             printf("%c%c%c%c%c%c%c", 0xB5, 0xF3, 0x03, 0x65, 0x72, 0x72, 0x3F); | ||||||
|  |             break; | ||||||
|  |         case VALIDATION_LENGTH_ERROR: | ||||||
|  |             printf("%c%c%c%c%c%c%c", 0xB5, 0xF4, 0x03, 0x65, 0x72, 0x72, 0x40); | ||||||
|  |             break; | ||||||
|  |         default: | ||||||
|  |             break; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| uint8_t calculate_crc(uint8_t package_header[3], uint8_t package_data[], size_t data_length) { | uint8_t calculate_crc(uint8_t data[], uint8_t data_length) { | ||||||
|     uint8_t crc = 0; |     uint8_t crc = 0; | ||||||
|  |  | ||||||
|     /* Calculate CRC for header */ |     for (uint8_t i = 1; i < data_length - 1; i++) { | ||||||
|     for (int i = 1; i < 3; i++) { |         crc += data[i]; | ||||||
|         crc += package_header[i]; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     for (size_t i = 0; i < data_length; i++) { |  | ||||||
|         crc += package_data[i]; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return (uint8_t) (crc & 0xFF); |     return (uint8_t) (crc & 0xFF); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | validation_result_t validate_package_crc(uint8_t *data, uint8_t data_length) { | ||||||
|  |     if (data[data_length - 1] == calculate_crc(data, data_length) && data_length == 3 + data[2] + 1) { | ||||||
|  |         return VALIDATION_SUCCESS; | ||||||
|  |     } else { | ||||||
|  |         return VALIDATION_CRC_ERROR; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | validation_result_t validate_package_header(uint8_t *data) { | ||||||
|  |     if (data[0] == PROTOCOL_PACKAGE_HEADER) { | ||||||
|  |         return VALIDATION_SUCCESS; | ||||||
|  |     } else { | ||||||
|  |         return VALIDATION_HEADER_ERROR; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | validation_result_t validate_package_type(uint8_t *data) { | ||||||
|  |     if (data[1] == PROTOCOL_BOARD_TYPE) { | ||||||
|  |         return VALIDATION_SUCCESS; | ||||||
|  |     } else { | ||||||
|  |         return VALIDATION_TYPE_ERROR; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | validation_result_t validate_data_length(uint8_t *data) { | ||||||
|  |     if (data[2] == PROTOCOL_PACKAGE_LENGTH) { | ||||||
|  |         return VALIDATION_SUCCESS; | ||||||
|  |     } else { | ||||||
|  |         return VALIDATION_LENGTH_ERROR; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void eddy_current_value_report(void) { | ||||||
|  |     static uint32_t eddy_current_value_uint32 = 0; | ||||||
|  |  | ||||||
|  |     eddy_current_value_uint32 = ldc1612_get_raw_channel_result(CHANNEL_0); | ||||||
|  |  | ||||||
|  |     package_data[0] = (eddy_current_value_uint32 >> 24) & 0xFF; | ||||||
|  |     package_data[1] = (eddy_current_value_uint32 >> 16) & 0xFF; | ||||||
|  |     package_data[2] = (eddy_current_value_uint32 >> 8) & 0xFF; | ||||||
|  |     package_data[3] = eddy_current_value_uint32 & 0xFF; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef DEBUG_VOFA_TOOL | ||||||
|  |     printf("%d\n", eddy_current_value_uint32); | ||||||
|  | #else | ||||||
|  |     package_data[0] = (eddy_current_value_uint32 >> 24) & 0xFF; | ||||||
|  |     package_data[1] = (eddy_current_value_uint32 >> 16) & 0xFF; | ||||||
|  |     package_data[2] = (eddy_current_value_uint32 >> 8) & 0xFF; | ||||||
|  |     package_data[3] = eddy_current_value_uint32 & 0xFF; | ||||||
|  |  | ||||||
|  |     uint8_t combined_data[7]; | ||||||
|  |     memcpy(combined_data, package_header, 3); | ||||||
|  |     memcpy(combined_data + 3, package_data, 4); | ||||||
|  |  | ||||||
|  |     printf("%c%c%c", package_header[0], package_header[1], package_header[2]); | ||||||
|  |     printf("%c%c%c%c", package_data[0], package_data[1], package_data[2], package_data[3]); | ||||||
|  |     printf("%c", calculate_crc(combined_data, 8)); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void tempture_value_report(void) { | ||||||
|  |     static uint32_t temperature_uint32 = 0; | ||||||
|  |  | ||||||
|  |     temperature_uint32 = tmp112a_get_raw_channel_result(); | ||||||
|  |  | ||||||
|  |     package_data[0] = (temperature_uint32 >> 24) & 0xFF; | ||||||
|  |     package_data[1] = (temperature_uint32 >> 16) & 0xFF; | ||||||
|  |     package_data[2] = (temperature_uint32 >> 8) & 0xFF; | ||||||
|  |     package_data[3] = temperature_uint32 & 0xFF; | ||||||
|  |  | ||||||
|  |     uint8_t combined_data[7]; | ||||||
|  |     memcpy(combined_data, package_header, 3); | ||||||
|  |     memcpy(combined_data + 3, package_data, 4); | ||||||
|  |  | ||||||
|  |     printf("%c%c%c", package_header[0], package_header[1], package_header[2]); | ||||||
|  |     printf("%c%c%c%c", package_data[0], package_data[1], package_data[2], package_data[3]); | ||||||
|  |     printf("%c", calculate_crc(combined_data, 8)); | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										217
									
								
								src/soft_i2c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								src/soft_i2c.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,217 @@ | |||||||
|  | // | ||||||
|  | // Created by dell on 24-12-28. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #include "soft_i2c.h" | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      delay | ||||||
|  |     \param[in]  none | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     none | ||||||
|  | */ | ||||||
|  | void soft_i2c_delay(void) { | ||||||
|  |     delay_us(20); // Adjust delay as needed | ||||||
|  |     /* delay to freq | ||||||
|  |      *  15KHz: delay_us(20); | ||||||
|  |      *  65KHz: delay_us(1); | ||||||
|  |      */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      configure the software IIC GPIO | ||||||
|  |     \param[in]  none | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     none | ||||||
|  | */ | ||||||
|  | void soft_i2c_config(void) { | ||||||
|  |     rcu_periph_clock_enable(RCU_GPIO_I2C); | ||||||
|  |  | ||||||
|  |     gpio_mode_set(I2C_SCL_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, I2C_SCL_PIN); | ||||||
|  |     gpio_output_options_set(I2C_SCL_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN); | ||||||
|  |  | ||||||
|  |     gpio_mode_set(I2C_SDA_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, I2C_SDA_PIN); | ||||||
|  |     gpio_output_options_set(I2C_SDA_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SDA_PIN); | ||||||
|  |  | ||||||
|  |     I2C_SCL_HIGH(); | ||||||
|  |     I2C_SDA_HIGH(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      generate I2C start signal | ||||||
|  |     \param[in]  none | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     none | ||||||
|  | */ | ||||||
|  | void soft_i2c_start(void) { | ||||||
|  |     I2C_SDA_HIGH(); | ||||||
|  |     I2C_SCL_HIGH(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SDA_LOW(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SCL_LOW(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      generate I2C stop signal | ||||||
|  |     \param[in]  none | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     none | ||||||
|  | */ | ||||||
|  | void soft_i2c_stop(void) { | ||||||
|  |     // sda_out(); | ||||||
|  |     I2C_SCL_LOW(); | ||||||
|  |     I2C_SDA_LOW(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SCL_HIGH(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SDA_HIGH(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      send I2C ACK signal | ||||||
|  |     \param[in]  none | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     none | ||||||
|  | */ | ||||||
|  | void soft_i2c_send_ack(void) { | ||||||
|  |     // sda_out(); | ||||||
|  |     I2C_SDA_LOW(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SCL_HIGH(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SCL_LOW(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SDA_HIGH(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      send I2C NACK signal | ||||||
|  |     \param[in]  none | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     none | ||||||
|  | */ | ||||||
|  | void soft_i2c_send_nack(void) { | ||||||
|  |     I2C_SDA_HIGH(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SCL_HIGH(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SCL_LOW(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SDA_HIGH(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      wait I2C ACK signal | ||||||
|  |     \param[in]  none | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     0: ACK received, 1: ACK not received | ||||||
|  | */ | ||||||
|  | uint8_t soft_i2c_wait_ack(void) { | ||||||
|  |     I2C_SDA_HIGH(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     I2C_SCL_HIGH(); | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     uint8_t ack = !I2C_SDA_READ(); | ||||||
|  |     I2C_SCL_LOW(); | ||||||
|  |     return ack; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      send a byte via I2C | ||||||
|  |     \param[in]  byte: byte to be sent | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     none | ||||||
|  | */ | ||||||
|  | void soft_i2c_send_byte(uint8_t byte) { | ||||||
|  |     // sda_out(); | ||||||
|  |     for (int i = 0; i < 8; i++) { | ||||||
|  |         if (byte & 0x80) { | ||||||
|  |             I2C_SDA_HIGH(); | ||||||
|  |         } else { | ||||||
|  |             I2C_SDA_LOW(); | ||||||
|  |         } | ||||||
|  |         byte <<= 1; | ||||||
|  |         soft_i2c_delay(); | ||||||
|  |         I2C_SCL_HIGH(); | ||||||
|  |         soft_i2c_delay(); | ||||||
|  |         I2C_SCL_LOW(); | ||||||
|  |         soft_i2c_delay(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |     \brief      receive a byte via I2C | ||||||
|  |     \param[in]  ack: 1: send ACK, 0: send NACK | ||||||
|  |     \param[out] none | ||||||
|  |     \retval     received byte | ||||||
|  | */ | ||||||
|  | uint8_t soft_i2c_receive_byte(uint8_t ack) { | ||||||
|  |     uint8_t byte = 0; | ||||||
|  |     I2C_SDA_HIGH(); | ||||||
|  |     for (int i = 0; i < 8; i++) { | ||||||
|  |         byte <<= 1; | ||||||
|  |         I2C_SCL_HIGH(); | ||||||
|  |         soft_i2c_delay(); | ||||||
|  |         if (I2C_SDA_READ()) { | ||||||
|  |             byte |= 0x01; | ||||||
|  |         } | ||||||
|  |         I2C_SCL_LOW(); | ||||||
|  |         soft_i2c_delay(); | ||||||
|  |     } | ||||||
|  |     if (ack) { | ||||||
|  |         soft_i2c_send_ack(); | ||||||
|  |     } else { | ||||||
|  |         soft_i2c_send_nack(); | ||||||
|  |     } | ||||||
|  |     return byte; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint8_t soft_i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]) { | ||||||
|  |     soft_i2c_start(); | ||||||
|  |     soft_i2c_send_byte(slave_addr); | ||||||
|  |     if (!soft_i2c_wait_ack()) { | ||||||
|  |         soft_i2c_stop(); | ||||||
|  |         return SOFT_I2C_FAIL; | ||||||
|  |     } | ||||||
|  |     soft_i2c_send_byte(reg_addr); | ||||||
|  |     if (!soft_i2c_wait_ack()) { | ||||||
|  |         soft_i2c_stop(); | ||||||
|  |         return SOFT_I2C_FAIL; | ||||||
|  |     } | ||||||
|  |     soft_i2c_send_byte(data[0]); | ||||||
|  |     if (!soft_i2c_wait_ack()) { | ||||||
|  |         soft_i2c_stop(); | ||||||
|  |         return SOFT_I2C_FAIL; | ||||||
|  |     } | ||||||
|  |     soft_i2c_send_byte(data[1]); | ||||||
|  |     if (soft_i2c_wait_ack()){} | ||||||
|  |     soft_i2c_stop(); | ||||||
|  |     return SOFT_I2C_OK; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint8_t soft_i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data) | ||||||
|  | { | ||||||
|  |     soft_i2c_start(); | ||||||
|  |     soft_i2c_send_byte(slave_addr); | ||||||
|  |     if (!soft_i2c_wait_ack()) { | ||||||
|  |         soft_i2c_stop(); | ||||||
|  |         return SOFT_I2C_FAIL; | ||||||
|  |     } | ||||||
|  |     soft_i2c_send_byte(reg_addr); | ||||||
|  |     if (!soft_i2c_wait_ack()) { | ||||||
|  |         soft_i2c_stop(); | ||||||
|  |         return SOFT_I2C_FAIL; | ||||||
|  |     } | ||||||
|  |     soft_i2c_start(); | ||||||
|  |     soft_i2c_send_byte(slave_addr | 0x01); | ||||||
|  |     if (!soft_i2c_wait_ack()) { | ||||||
|  |         soft_i2c_stop(); | ||||||
|  |         return SOFT_I2C_FAIL; | ||||||
|  |     } | ||||||
|  |     soft_i2c_delay(); | ||||||
|  |     data[0] = soft_i2c_receive_byte(1); | ||||||
|  |     data[1] = soft_i2c_receive_byte(0); | ||||||
|  |     soft_i2c_stop(); | ||||||
|  |     return SOFT_I2C_OK; | ||||||
|  | } | ||||||
| @@ -9,7 +9,13 @@ uint32_t tmp112a_get_raw_channel_result(void) { | |||||||
|     uint8_t value[2] = {0}; |     uint8_t value[2] = {0}; | ||||||
|  |  | ||||||
|     // ldc1612_iic_read_16bits(CONVERTION_RESULT_REG_START + channel, value); |     // ldc1612_iic_read_16bits(CONVERTION_RESULT_REG_START + channel, value); | ||||||
|     i2c_read_16bits(TMP112A_ADDR, 0x00, value); |  | ||||||
|  | #ifdef SOFTWARE_IIC | ||||||
|  |     soft_i2c_read_16bits(TMP112A_ADDR, TMP112A_TEMP_REG, value); | ||||||
|  | #else | ||||||
|  |     i2c_read_16bits(TMP112A_ADDR, TMP112A_TEMP_REG, value); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|     raw_value = ((uint16_t) (value[0] << 4) | (value[1]>>4)); |     raw_value = ((uint16_t) (value[0] << 4) | (value[1]>>4)); | ||||||
|     return (raw_value * 625); |     return (raw_value * 625); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user