I²C那点事儿(一)

简介

  1. 不管你是从哪里听说的这个概念,我都要先告诉你,咱们15年前家里的大彩电,就是由这样的一个协议来完成控制的。当你按下遥控器的瞬间,那颗彩电的主控芯片从遥控器的红外信号得到指令,朝着村口大喇叭喊了一嗓子,你们谁是张三,村长让你这会儿去一趟村委会给你安排个活儿。后来我们知道这个大喇叭即是总线,村长安排什么活,对应你遥控器的指令,很多你自己按不出来的效果,比如出现在彩电上的大骨头图案。如此我们应该对该协议有了一个非常直观的第一印象了。那么接下来看专业说明。
    在这里插入图片描述
    这张图告诉你有一个主机一个从机,简单来讲,SDA为serial data端口,你知道它传数据,SCL为serial clk是串行时钟口。他们按照以下格式进行传输:
    注意它和SPI一样都是逐bit传输的。那么解决传输的内容后,我们需要确定传输的步骤,毕竟协议就是干这个事儿的。注意到START_BIT为下降沿,STOP_BIT为上升沿检测。
    第一步,村长(主机)拿出大喇叭(传到总线)告诉大家听我说,也就对应这个START_BIT,此时所有村民(从机)来活了。
    第二步,村长(主机)说张三(往总线扔地址)你过来一趟村委会找你有事(读或者写)。
    第三步,听到名字的村民吱一声(ACK位确认,给0)。没听到的不吱声(ACK给1)。
    第四步,干活去吧(村民帮村长干活或者村长帮村民做事)分别对应谁是接收者,谁读谁写。
    第五步,做完了感谢一下对方,给点礼物回馈一下(确认位确认接收完毕了)。
    第六步,搞定,发送STOP_BIT,村长大喇叭宣布此次行动张三表现的不错或者他帮助张三帮的不错。任务完成。

优缺点说明

  1. 优点:第一,可以多设备主从互动,也就是可以一个人叫一个人帮忙,也可以一群人叫一个人,也可以一群叫一群,都可以。第二, 只要两根线即可以完成各种数据传输。第三,有确认位,也就是说每次数据传对传错都是知道的。第四,硬件依赖度比通用串口UART简单。也因此在工业界广泛使用。
  2. 缺点,第一,每次只能传八位最多,第二,速度慢,工业使用足够不过。第三,硬件依赖高于SPI,且协议比SPI复杂点。

简单总结

  1. I²C是很广泛使用的工业控制协议,是作为我们专业必须完全掌握的三大基础协议之一,更不用说当前更加流行速度更加夸张的一系列Serdes接口协议。必须打好基础,基础扎实才能游刃有余。
  2. 第一部分先简单介绍到这里,争取这周之前把协议详解和代码实现的笔记写出来。

参考资料

https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/

<think>首先,用户要求使用中文回答问题。问题是用中文写的:“C语言怎么实现对个数组中的整数元素进行排序”,意思是“How to implement sorting of integer elements in an array using C language”。 我需要回答这个问题,然后根据问题和我的回答提出3-5个相关问题。这些问题必须以“§§相关问题§§”开头,并且不能分散在换行中;它们必须在行之后连续输出,就像示例中样。 回顾示例:在回答完快速排序后,它直接输出“§§相关问题§§”,然后列出编号的问题,每个问题以数字开头。 我的回答应该包括: 1. 解释如何在C语言中实现数组排序。 2. 提供个代码示例,就像示例中的Python代码样。 3. 然后,以“§§相关问题§§”开头,列出3-5个相关问题。 对于排序,我可以选择种常见的排序算法,比如冒泡排序或快速排序,因为用户提到了快速排序在示例中。为了简单起见,我会使用冒泡排序,因为它易于实现和理解。 步骤: - 定义问题:对整数数组进行排序。 - 选择个算法:冒泡排序。 - 编写C代码。 - 解释代码。 然后,提出相关问题。相关问题应该基于我的回答和原始问题。例如: - 其他排序算法。 - 优化。 - 应用场景。 确保所有内容用中文。 结构我的回答: 1. 回答部分:解释排序实现。 2. 代码块:用C语言编写排序代码。 3. 相关问题部分:以“§§相关问题§§”开头,然后列出问题。 代码格式:在示例中,代码用三重反引号包裹,所以我应该做同样的事。 最终输出: - 回答文本。 - ```c // C code here ``` - §§相关问题§§ 1. ... 2. ... 3. ... 现在,脑力 storm 相关问题: 1. 冒泡排序的时间复杂度是多少? 2. 如何在C语言中实现其他排序算法,如快速排序? 3. 如何对数组进行降序排序? 4. 排序算法在实际应用中的例子有哪些? 5. 如何优化冒泡排序? 我需要3-5个,所以选择4个。 编写回答: 首先,解释冒泡排序的基本思想:通过重复交换相邻元素,如果它们顺序错误。 然后,提供代码。 代码示例: ```c #include <stdio.h> void bubbleSort(int arr[], int n) { for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { // 交换 arr[j] 和 arr[j+1] int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); bubbleSort(arr, n); printf("排序后的数组: \n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 在解释中,简要描述。 然后,相关问题。 确保语言是中文。</think>在C语言中,对整数数组进行排序可以通过多种算法实现,其中冒泡排序是种简单且常用的法。其基本思想是重复遍历数组,比较相邻元素,如果顺序错误(例如前个大于后个),则交换它们。这样,每轮遍历都会将最大的元素“冒泡”到数组末尾。重复此过程,直到整个数组有序。以下是完整的C语言实现代码,包括个示例主函数来演示排序过程: ```c #include <stdio.h> // 冒泡排序函数 void bubbleSort(int arr[], int n) { for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { // 如果前个元素大于后个,交换它们 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; // 示例数组 int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度 bubbleSort(arr, n); // 调用排序函数 printf("排序后的数组: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); // 输出排序结果 } return 0; } ``` 此代码首先定义了个 `bubbleSort` 函数,它接受数组和长度作为参数,并通过嵌套循环实现排序。主函数中创建了个测试数组,调用排序函数后打印结果。运行此程序会输出:`排序后的数组: 11 12 22 25 34 64 90`。冒泡排序的时间复杂度为 O(),适用于小规模数据排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值