I2C模块理解
I2C模块理解
文章目录
- I2C模块理解
- 1.配置I2C
- 2.信号
- 3.数据传输
- 3.1主机发送
- 3.2主机接收
- 3.3从机发送
- 3.4从机接收
- 4.中断传输
- 5.Aardvark
1.配置I2C
I2C的特征
- 只需要两条公共总线(线)即可控制I2C网络上的任何设备
- 无需像UART通信那样事先约定数据传输速率。因此可以根据需要随时调整数据传输速度
- 用于验证传输数据的简单机制
- 使用7位寻址系统来定位I2C总线上的特定设备
- I2C网络易于扩展,新设备可以简单地连接到两条公共I2C总线上

I2C优缺点
1.由于只需要两根电线,I2C 非常适合有许多设备连接在总线上的电路板。这有助于降低成本和电路的复杂性作为额外的设备添加到系统。
2.由于只有两条连接,因此处理寻址和确认的开销会更加复杂。这在简单的配置中可能效率低下,可能首选 SPI 这样的直接链接接口。
2.信号
1.起始信号
I2C协议规定,SCL处于高电平时,SDA由高到低变化,这种信号是起始信号。
2.停止信号
I2C协议规定,SCL处于高电平,SDA由低到高变化,这种信号是停止信号。
3.数据有效性
I2C协议对数据的采样发生在SCL高电平期间,除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。
4.应答信号与非应答信号
应答信号出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机
如果总线之前为高电平,从机控制总线从高电平到低电平,则为应答信号
如果总线之前为高电平,从机控制总线持续高电平,则为非应答信号
3.数据传输
| 传输模式 | SDA | SCL | 备注 |
|---|---|---|---|
| 主机发送模式 | 输出 | 输出 | 主机发送一系列数据到从机。一个开始条件(S),随后一个从机地址,(SLA)+写控制字(W),表示进入主机发送模式。 |
| 主机接收模式 | 输入 | 输出 | 主机接收模式中,主机从从机接收一系列数据。一个开始条件(S),随后一个从机地址,(SLA)+读控制字®表示进入主机接收模式。 |
| 从机接收模式 | 输入 | 输入 | 从机接收模式中,从机从主机接收一系列数据,进入从机模式前,需设置从机地址 |
| 从机发送模式 | 输出 | 输入 | 从机发送模式中,从机发送一系列数据到主机。进入从机模式前,需设置从机地址 |
I2C 数据传输是以8-bit 进行双向数据传输,标准模式下可达100kbit/s 的传输速率,快速模式可达400kbit/s 的传输速率。
I2C 协议的一个示例。

3.1主机发送
示意图:
void HT_I2C_Master_Transmit(HT_I2C_TypeDef *I2Cx, uint8_t DevAddress, uint8_t *pData, uint16_t Size)
{// 1.查询I2C 控制寄存器中的开始标志位, 如果空闲则生成开始信号, 否则不会生成开始信号HT_I2C_start(I2Cx); // 2.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;} if(I2Cx == HT_I2C0){// 3.查询I2C 状态寄存器中是否未启动标志 08H -> 起始条件已被发送if(HT_I2C0->I2CSTA == I2C_START){// 4.写入I2C 数据寄存器 从机地址HT_I2C0->I2CDAT = I2C_ADD_WRITE (DevAddress);// 5.清空I2C 控制寄存器中的中断标志位HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/ }else return;// 6.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;} // 7.查询I2C 状态寄存器是否回复ACK 0X18H为 SLA+W 已被发送 ACK 已被接收if(HT_I2C0->I2CSTA!= I2C_MASTER_TRANS_ADDR_ACK) {return;}else{while (Size > 0) /* send data to slave */{// 8.写入I2C 数据寄存器的值 遍历pData数组HT_I2C0->I2CDAT = *(pData++); // 9.清空I2C 控制寄存器中的中断标志位 HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/ // 10.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while (HT_I2C_ITFlagStatusGet (I2Cx)== RESET) {;} // 11.查询I2C 状态寄存器是否回复ACK 0X28H为 数据字节已被发送, ACK 已被接收if (HT_I2C0->I2CSTA != I2C_MASTER_TRANS_DATA_ACK) {return;}}}// 12.清空I2C 控制寄存器中的停止标志位 1:当处于主机模式,则向总线传输停止信号 0:不向总线传输停止信号 当前为主机模式HT_I2C0->I2CCON |= I2C_I2CCON_STO;// 13.清空I2C 控制寄存器中的中断标志位HT_I2C0->I2CCON&= ~I2C_I2CCON_SI;
}
3.2主机接收

void HT_I2C_Master_Receive (HT_I2C_TypeDef *I2Cx,uint8_t DevAddress, uint8_t *pData, uint16_t Size)
{// 1.查询I2C 控制寄存器中的开始标志位, 如果空闲则生成开始信号, 否则不会生成开始信号HT_I2C_Start (I2Cx); /*Generate start condition*/ // 2.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while (HT_I2C_ITFlagStatusGet (I2Cx)== RESET) {;} if (I2Cx == HT_I2C0){// 3.查询I2C 状态寄存器中是否未启动标志 08H -> 起始条件已被发送if (HT_I2C0->I2CSTA== I2C_START) /*start condition transmitted*/ {// 4.读取I2C 数据寄存器 从机地址HT_I2C0->I2CDAT = I2C_ADD_READ (DevAddress); /* Send Slave address */ // 5.清空I2C 控制寄存器中的中断标志位HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/ }else return;// 6.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while (HT_I2C_ITFlagStatusGet (I2Cx)== RESET) {;} // 7.查询I2C 状态寄存器是否 40H SLA+R 已被发送; ACK 已被接收 if (HT_I2C0->I2CSTA!= I2C_MASTER_RCV_ADDR_ACK) {return;}else{while (Size >0){// 8.将获取到的数据放入数组pData中*(pData++) = HT_I2C0->I2CDAT ; /* 获取数据*/ // 9.清空I2C 控制寄存器中的中断标志位HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/ // 10.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while (HT_I2C_ITFlagStatusGet (I2Cx)== RESET) {;} // 11. 50H 数据字节已被接收;已返回ACKif (HT_I2C0->I2CSTA != I2C_MASTER_RCV_DATA_ACK) {return;}}}HT_I2C0->I2CCON |= I2C_I2CCON_STO; /*Generate STOP condition*/HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/}
3.3从机发送

void HT_I2C_Slave_Transmit(HT_I2C_TypeDef *I2Cx,uint8_t *pData, uint16_t Size)
{if (I2Cx==HT_I2C0){// 1.查询I2C 控制寄存器中的中断标志位,清除中断标志HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/ // 2.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;} // 3.A8H 自身SLA+R 已被接收;已返回ACKif(HT_I2C0->I2CSTA == I2C_SLAVE_TRANS_ADDR_ACK) {// 4.发送数据到接收器while(Size >0) /* send data to slave */ {// 5.写入I2C 数据寄存器的值 遍历pData数组HT_I2C0->I2CDAT = *(pData++); // 6.查询I2C 控制寄存器中的中断标志位,清除中断标志 HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; // 7.查询I2C 控制寄存器中的中断标志位,判断是否置位成功 while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;} // 8.B8H 数据字节已被发送;ACK 已被接收 if (HT_I2C0->I2CSTA != I2C_SLAVE_TRANS_DATA_ACK) {return;}}}else return;}
}
3.4从机接收

void HT_I2C_Slave_Receive(HT_I2C_TypeDef *I2Cx,uint8_t *pData, uintl6_t Size)
{if (I2Cx== HT_I2C0){// 1.查询I2C 控制寄存器中的中断标志位,清除中断标志HT_I2C0->I2CCON &= ~I2C_I2CCON_SI; /* Clear the SI bit*/// 2.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;}// 3.60H 自身的SLA+W 已被接收;已返回ACKif(HT_I2C0->I2CSTA == I2C_SLAVE_RCV_ADDR_ACK){// 4.发送数据到接收器while(Size >0) /* send data to slave */{// 5.写入I2C 数据寄存器的值 遍历pData数组*(pData++) = HT_I2C0->I2CDAT;// 6.查询I2C 控制寄存器中的中断标志位,清除中断标志HT_I2C0->I2CCON &= ~I2C_I2CCON_SI;// 7.查询I2C 控制寄存器中的中断标志位,判断是否置位成功while(HT_I2C_ITFlagStatusGet(I2Cx)==RESET){;}// 8.80H 自身SLV 地址已被寻址;DATA 字节已被接收; 已返回ACKif (HT_I2C0->I2CSTA != I2C_SLAVE_RCV_DATA_ACK){return;}}}else return;}}
4.中断传输
对I2C总线来说工作在中断和非中断模式在时序上是相同的,只不过在非中断模式下是通过检测ACK信号来判断从设备响应了,在中断模式下是通过中断信号来判断从设备响应了,一般是读主CPU侧的I2C控制器的中断标志来判断的。
5.Aardvark
1.aardvark适配器为发送器接口函数
# 1.设置比特率
Set Bitrate (aa_i2c_bitrate)
# 2.从 I2C 从设备读取字节流。
Master Read (aa_i2c_read)
# 3.从具有扩展状态信息的 I2C 从设备读取字节流
Master Read Extended (aa_i2c_read_ext)
# 4.向 I2C 从设备写入字节流。
Master Write (aa_i2c_write)
# 5.向具有扩展状态信息的 I2C 从设备写入字节流。
Master Write Extended (aa_i2c_write_ext)
# 6.向 I2C 从设备写入一个字节流,然后从同一个从设备读取。
Master Write-Read (aa_i2c_write_read)
2.aardvark适配器为接收器接口函数
# 1.启用 Aardvark 适配器作为 I2C 从设备。
Slave Enable (aa_i2c_slave_enable)
# 2.禁用 Aardvark 适配器作为 I2C 从设备。
Slave Disable (aa_i2c_slave_disable)
# 3.在 Aardvark 适配器进入从模式并由主服务器联系的情况下设置从服务器响应。
Slave Set Response (aa_i2c_slave_set_response)
# 4.返回从以前的 Aardvark I2C 从节写入到 I2C 主传输的字节数。
Slave Write Statistics (aa_i2c_slave_write_stats)
# 5.返回从以前的 Aardvark I2C 从服务器写入到具有扩展状态信息的 I2C 主传输的字节数。
Slave Write Statistics Extended (aa_i2c_slave_write_stats_ext)
# 6.从 I2C 从接收机读取字节。
Slave Read (aa_i2c_slave_read)
# 7.从具有扩展状态信息的 I2C 从接收机读取字节。
Slave Read Extended (aa_i2c_slave_read_ext)
3.使用方式
# 1.打开Aardvark端口
handle = aa_open(port)
if handle <= 0:print("Unable to open Aardvark device on port %d" % port)print("Error code = %d" % handle)sys.exit()# 2.激活/关闭各个子系统(I2C,SPI,GPIO)
aa_configure(handle, AA_CONFIG_SPI_I2C) # 3.启动/关闭 SCL 和 SDA 上的 I2C 上拉电阻器
aa_i2c_pullup(handle, AA_I2C_PULLUP_BOTH) # Power the EEPROM using the Aardvark adapter's power supply.
# 4.激活/关闭目标电源插脚4和6
aa_target_power(handle, AA_TARGET_POWER_BOTH) # 5.将 I2C 比特率设置为kHz
bitrate = aa_i2c_bitrate(handle, bitrate)
print("Bitrate set to %d kHz" % bitrate)# Set the bus lock timeout
# 6.以毫秒为单位设置 I2C 总线锁定超时
bus_timeout = aa_i2c_bus_timeout(handle, BUS_TIMEOUT)
print("Bus lock timeout set to %d ms" % bus_timeout)# Perform the operation
if command == "write":_writeMemory(handle, device, addr, length, 0) # 7.向 I2C 从设备写入字节流 地址、字节长度、FLAG、指向数据的指针print("Wrote to EEPROM")elif command == "read":_readMemory(handle, device, addr, length) # 8.从 I2C 从设备读取字节流 地址、字节长度、FLAG、指向数据的指针
信号线:

- SCL
- GND
- SDA
- NC/+5V
- MISO
- NC/+5V
- SCLK
- MOSI
- SS
- GND
疑问:
1.为什么每次执行程序之前都要清楚中断标志?
参考文档:
(43条消息) IIC中断和非中断模式_i2c 中断模式_退5不落5的博客-CSDN博客
(43条消息) 轮询和中断的区别,中断上下文_小翅小排的博客-CSDN博客
https://www.totalphase.com/support/articles/200468316#s5.5
https://pyaardvark.readthedocs.io/en/latest/intro.html#on-pyaardvark-datatypes
I2C通信基础知识:硬件、数据传输、配置 (enroo.com)
(51条消息) STM32F767+STM32CubeMX I2C通信读写EEPROM数据(采用轮询、DMA、中断三种方式)_stm32cubemx配置iic总线读写eeprom代码_LI++的博客-CSDN博客
(61条消息) Arduino UNO向AT24C02写入数据IIC完整通讯过程详解_at24c02写数据流程图_perseverance52的博客-CSDN博客
(61条消息) I2C通信协议详解-CSDN博客
相关文章:
I2C模块理解
I2C模块理解 文章目录I2C模块理解1.配置I2C2.信号3.数据传输3.1主机发送3.2主机接收3.3从机发送3.4从机接收4.中断传输5.Aardvark1.配置I2C I2C的特征 只需要两条公共总线(线)即可控制I2C网络上的任何设备无需像UART通信那样事先约定数据传输速率。因此…...
手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)
最近在学STM32,基本的学完了,想学几个模块来巩固一下知识,就想到了蓝牙模块。玩啥好难过有很多博客教怎么连的,但自己看起来还是有点糊涂。模块的原理和知识点我就不讲解了,这里我主要手把手记录一下我是如何对蓝牙模块…...
MyBatis高频面试题
目录 1、Mybatis中#和$的区别 2、Mybatis的编程步骤是什么样的 3...
Redis基础篇
redis的三大特点: 支持多数据类型,支持持久化,单线程 多路IO复用 对键操作的命令: keys * 查看当前库所有key exists key 判断key是否存在 del key 删除 unlink key 非阻塞删除,异步删除 expire key …...
unity的C#学习——静态常量和动态常量的定义与使用
定义常量 在C#中,常量是一种不可改变的量,一旦被定义,其值就不能被修改。C#中有两种类型的常量,静态常量和动态常量。 1、静态常量的定义 静态常量是在编译时就已经确定其值的常量,使用const关键字定义。由于在编译…...
栈----数据结构
栈🔆栈的概念🔆栈的结构🔆栈的实现🔆括号匹配问题🔆结语🔆栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端称为栈顶&am…...
【人人都能读标准】11. 原理篇总结:一个程序的完整执行过程
本文为《人人都能读标准》—— ECMAScript篇的第11篇。我在这个仓库中系统地介绍了标准的阅读规则以及使用方式,并深入剖析了标准对JavaScript核心原理的描述。 我们一路走了很远很远,终于到了本书原理篇的最后一站。 在原理篇中,我们先讲了…...
sheng的学习笔记-IO多路复用,NIO,BIO,AIO
基础概念IO分为几种:同步阻塞的BIO,同步非阻塞的NIO,异步非阻塞AIO,IO多路复用,信号驱动IO(不常用)对于一个network IO,它会涉及到两个系统对象,一个是调用这个IO的proce…...
【Python入门第三十五天】Python丨文件打开
在服务器上打开文件 假设我们有以下文件,位于与 Python 相同的文件夹中。 demofile.txt Hello! Welcome to demofile.txt This file is for testing purposes. Good Luck!如需打开文件,请使用内建的 open() 函数。 open() 函数返回文件对象ÿ…...
jsoup 框架的使用指南
概述 参考: 官方文档jsoup的使用JSoup教程jsoup 在 GitHub 的开源代码 概念简介 jsoup 是一款基于 Java 的 HTML 解析器,它提供了一套非常省力的 API,不但能直接解析某个 URL 地址、HTML 文本内容,而且还能通过类似于 DOM、CS…...
web前端开发和后端开发哪个难度大?
前言 因为涉及到的具体的应用的领域不同,所以说不能简单地说哪一个难,对于前端而言你会感觉到入门会非常的简单,这也是会给许多人一种错觉,前端很简单,但是只能说是在入门理解上是有利于新手的,前端在主要…...
认证与认可之间有什么区别和联系?
认证与认可之间有什么区别和联系? 当今社会,认证与认可已经深入企业的生活,那么认证与认可之间到底有什么区别和联系呢? 认证,是指由认证机构证明产品、服务、管理体系符合相关技术规范、相关技术规范的强制性要求或者…...
【Java|golang】1626. 无矛盾的最佳球队---最长子序列,不连续,二维数组排序
假设你是球队的经理。对于即将到来的锦标赛,你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。 然而,球队中的矛盾会限制球员的发挥,所以必须选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严格大于 一名…...
C++ 八股文(简单面试题)
1.左值 可寻址变量,持久性; 2.右值 没有变量名,不可寻址,短暂性; 3.指针 指向的内存地址,指针变量存储的就是指向的对象的首地址 4.引用 为一个变量起别名,定义引用的时候一定要初始化&a…...
RK3588平台开发系列讲解(显示篇)DP显示调试方法
平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看 connector 状态二、强制使能/禁⽤ DP三、DPCP 读写四、Type-C 接口 Debug五、查看 DP 寄存器六、查看 VOP 状态七、查看当前显示时钟八、调整 DRM log 等级沉淀、分享、成长,让自己和他人都能有所收获!😄…...
模拟请求发生跨域问题
参考:传送门 问题产生: Access to XMLHttpRequest at ‘http://test-cms.jinhuahuolong.com/api/pages/list’ from origin ‘null’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resourc…...
Qt实践项目:仿Everything软件实现一个QtEverything
⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…...
WEB网站服务(一)
1.1 Apache网站服务基础1.1.1Apache简介Apache HTTP Server是开源软件项目的杰出代表,基于标准的HTTP网络协议提供网页浏览服务。Apache服务器可以运行在Linux,UNIX,windows等多种操作系统平台中。1.Apache的起源1995年,Apache服务程序的1.0版…...
Python数据分析script必备知识(一)
Python数据分析script必备知识(一) 1.重定向终端输出内容 使生成的结果移动到其他位置 # 重定向, 使生成的结果移动到其他位置 import syssys.stderr = sys.stdoutprint(dir(sys)) # ,,,,,__stderr__, __stdin__, __stdout__,,,,,,# 使用场景:脚本上线时,想要把输出结果…...
初识linux之管道
一、进程间通信的概念大家都知道,进程是具有独立性的,因为一个程序运行起来生成进程时,也会生成它的进程结构体,即PCB,然后然后通过进程结构体中的结构体指针找到它的虚拟地址空间,然后再通过它的页表映射到…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
