ARM-I2C硬實現

硬件I2C-GD32F4系列的實現

===初始化操作===

在初始化函數里執行以下代碼

uint32_t i2cx_scl_port_rcu = RCU_GPIOB;
uint32_t i2cx_scl_port = GPIOB;
uint32_t i2cx_scl_pin = GPIO_PIN_6;
uint32_t i2cx_scl_af = GPIO_AF_4;uint32_t i2cx_sda_port_rcu = RCU_GPIOB;
uint32_t i2cx_sda_port = GPIOB;
uint32_t i2cx_sda_pin = GPIO_PIN_7;
uint32_t i2cx_sda_af = GPIO_AF_4;uint32_t i2cx = I2C0;
uint32_t i2cx_rcu = RCU_I2C0;
uint32_t i2cx_speed = 400000;
/****************** GPIO config **********************/
// 時鐘配置
rcu_periph_clock_enable(i2cx_scl_port_rcu);
// 設置復用功能
gpio_af_set(i2cx_scl_port, i2cx_scl_af, i2cx_scl_pin);
// 設置輸出模式
gpio_mode_set(i2cx_scl_port, GPIO_MODE_AF, GPIO_PUPD_NONE, i2cx_scl_pin);
gpio_output_options_set(i2cx_scl_port, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, i2cx_scl_pin);// 時鐘配置
rcu_periph_clock_enable(i2cx_sda_port_rcu);
// 設置復用功能
gpio_af_set(i2cx_sda_port, i2cx_sda_af, i2cx_sda_pin);
// 設置輸出模式
gpio_mode_set(i2cx_sda_port, GPIO_MODE_AF, GPIO_PUPD_NONE, i2cx_sda_pin);
gpio_output_options_set(i2cx_sda_port, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, i2cx_sda_pin);/****************** I2C config  **********************/
i2c_deinit(i2cx);
// 時鐘配置
rcu_periph_clock_enable(i2cx_rcu);
// I2C速率配置
i2c_clock_config(i2cx, i2cx_speed, I2C_DTCY_2);// 使能i2c
//i2c_mode_addr_config(i2cx, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0x00);
i2c_enable(i2cx);// i2c ack enable
i2c_ack_config(i2cx, I2C_ACK_ENABLE);
  • 哪個I2C
  • SCL是哪個引腳
  • SDA是哪個引腳
  • 速度是多快

準備兩個wait函數

等待指定外設的flag狀態變化的函數

#define	TIMEOUT	50000
static uint8_t I2C_wait(uint32_t flag) {uint16_t cnt = 0;while(!i2c_flag_get(i2cx, flag)) {cnt++;if(cnt > TIMEOUT) return 1;}return 0;
}static uint8_t I2C_waitn(uint32_t flag) {uint16_t cnt = 0;while(i2c_flag_get(i2cx, flag)) {cnt++;if(cnt > TIMEOUT) return 1;}return 0;
}

===寫操作流程===

開始

/************* start ***********************/
// 等待I2C閑置
if(I2C_waitn(I2C_FLAG_I2CBSY)) return 1;
// start
i2c_start_on_bus(i2cx);
// 等待I2C主設備成功發送起始信號
if(I2C_wait(I2C_FLAG_SBSEND)) return 2;

發送設備地址

注意??,這里是設備的寫地址write_addr

/************* device address **************/
// 發送設備地址
i2c_master_addressing(i2cx, write_addr, I2C_TRANSMITTER);
// 等待地址發送完成
if(I2C_wait(I2C_FLAG_ADDSEND)) return 3;
i2c_flag_clear(i2cx, I2C_FLAG_ADDSEND);

發送寄存器地址

/************ register address ************/
// 寄存器地址
// 等待發送數據緩沖區為空
if(I2C_wait(I2C_FLAG_TBE)) return 4;// 發送數據
i2c_data_transmit(i2cx, reg);// 等待數據發送完成
if(I2C_wait(I2C_FLAG_BTC)) return 5;

數據發送

/***************** data ******************/
// 發送數據
uint32_t i;
for(i = 0; i < len; i++) {uint32_t d = data[i];// 等待發送數據緩沖區為空if(I2C_wait(I2C_FLAG_TBE)) return 6;// 發送數據i2c_data_transmit(i2cx, d);// 等待數據發送完成if(I2C_wait(I2C_FLAG_BTC)) return 7;
}

停止

/***************** stop ********************/
// stop
i2c_stop_on_bus(i2cx);if(I2C_waitn(I2C_CTL0(i2cx)&I2C_CTL0_STOP)) return 8;

===讀操作流程===

開始

/************* start ***********************/
// 等待I2C空閑
if(I2C_waitn(I2C_FLAG_I2CBSY)) return 1;
// 發送啟動信號
i2c_start_on_bus(i2cx);
// 等待I2C主設備成功發送起始信號
if(I2C_wait(I2C_FLAG_SBSEND)) return 2;

發送設備地址(寫)

/************* device address **************/
// 發送從設備地址
i2c_master_addressing(i2cx, address, I2C_TRANSMITTER);if(I2C_wait(I2C_FLAG_ADDSEND)) return 3;
i2c_flag_clear(i2cx, I2C_FLAG_ADDSEND);

發送寄存器地址

/********** register address **************/
// 等待發送緩沖區	
if(I2C_wait(I2C_FLAG_TBE)) return 4;// 發送寄存器地址
i2c_data_transmit(i2cx, reg);// 等待發送數據完成	
if(I2C_wait(I2C_FLAG_BTC)) return 5;

開始

/************* start ***********************/
// 發送再啟動信號
i2c_start_on_bus(i2cx);if(I2C_wait(I2C_FLAG_SBSEND)) return 7;

發送設備地址(讀)

/************* device address **************/
// 發送從設備地址
i2c_master_addressing(i2cx, address, I2C_RECEIVER);
if(I2C_wait(I2C_FLAG_ADDSEND)) return 8;
i2c_flag_clear(i2cx, I2C_FLAG_ADDSEND);

數據讀取

/************* data **************/
//ack
i2c_ack_config(i2cx, I2C_ACK_ENABLE);
// 接收一個數據后,自動發送ACK
i2c_ackpos_config(i2cx, I2C_ACKPOS_CURRENT);
// 確認ACK已啟用
if(I2C_wait(I2C_CTL0(i2cx) & I2C_CTL0_ACKEN)) return 11;// 讀取數據
uint32_t i;
for (i = 0; i < len; i++) {if (i == len - 1) {// 在讀取最后一個字節之前,禁用ACK,配置為自動NACKi2c_ack_config(i2cx, I2C_ACK_DISABLE);}// 等待接收緩沖區不為空if(I2C_wait(I2C_FLAG_RBNE)) return 10;data[i] = i2c_data_receive(i2cx);
}

停止

/***************** stop ********************/
i2c_stop_on_bus(i2cx);if(I2C_waitn(I2C_CTL0(i2cx)&I2C_CTL0_STOP)) return 12;

GD32F4寄存器

流程

功能

標記

描述

START

I2C_FLAG_I2CBSY

busy標記。I2C是否占用,沒有占用才可以使用。

I2C_FLAG_SBSEND

起始信號發送狀態標記。START成功或失敗。

數據

設備地址

I2C_FLAG_ADDSEND

地址發送狀態標記。成功或失敗。

發送

I2C_FLAG_TBE

發送數據寄存器是否為空的標記。為空才可以繼續發送。

I2C_FLAG_BTC

發送數據寄存器中數據是否發送完成。

接收

I2C_FLAG_RBNE

接收緩沖區寄存器是否為空的標記。為空才可以繼續接收。

STOP

I2C_CTL0_STOP

停止標記位。

完整代碼

//I2C0.h
#ifndef __I2C0_H__
#define __I2C0_H__#include "systick.h"
#include "gd32f4xx.h"void I2C0_init();uint8_t I2C0_read(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t len);uint8_t I2C0_write(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t len);uint8_t I2C0_write2(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t offset, uint32_t len);void I2C0_deinit();#endif

?

//I2C0.c
#include "I2C0.h"#define i2cx	I2C0void I2C0_init() {uint32_t i2cx_scl_port_rcu = RCU_GPIOB;uint32_t i2cx_scl_port = GPIOB;uint32_t i2cx_scl_pin = GPIO_PIN_6;uint32_t i2cx_scl_af = GPIO_AF_4;uint32_t i2cx_sda_port_rcu = RCU_GPIOB;uint32_t i2cx_sda_port = GPIOB;uint32_t i2cx_sda_pin = GPIO_PIN_7;uint32_t i2cx_sda_af = GPIO_AF_4;uint32_t i2cx = I2C0;uint32_t i2cx_rcu = RCU_I2C0;uint32_t i2cx_speed = 400000;/****************** GPIO config **********************/// 時鐘配置rcu_periph_clock_enable(i2cx_scl_port_rcu);// 設置復用功能gpio_af_set(i2cx_scl_port, i2cx_scl_af, i2cx_scl_pin);// 設置輸出模式gpio_mode_set(i2cx_scl_port, GPIO_MODE_AF, GPIO_PUPD_NONE, i2cx_scl_pin);gpio_output_options_set(i2cx_scl_port, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, i2cx_scl_pin);// 時鐘配置rcu_periph_clock_enable(i2cx_sda_port_rcu);// 設置復用功能gpio_af_set(i2cx_sda_port, i2cx_sda_af, i2cx_sda_pin);// 設置輸出模式gpio_mode_set(i2cx_sda_port, GPIO_MODE_AF, GPIO_PUPD_NONE, i2cx_sda_pin);gpio_output_options_set(i2cx_sda_port, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, i2cx_sda_pin);/****************** I2C config  **********************/i2c_deinit(i2cx);// 時鐘配置rcu_periph_clock_enable(i2cx_rcu);// I2C速率配置i2c_clock_config(i2cx, i2cx_speed, I2C_DTCY_2);// 使能i2ci2c_mode_addr_config(i2cx, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0x00);i2c_enable(i2cx);// i2c ack enablei2c_ack_config(i2cx, I2C_ACK_ENABLE);//i2c_ackpos_config(i2cx, I2C_ACKPOS_CURRENT);}static uint8_t I2C_wait(uint32_t flag) {uint16_t TIMEOUT = 50000;uint16_t cnt = 0;while(!i2c_flag_get(i2cx, flag)) {cnt++;if(cnt > TIMEOUT) return 1;}return 0;
}static uint8_t I2C_waitn(uint32_t flag) {uint16_t TIMEOUT = 50000;uint16_t cnt = 0;while(i2c_flag_get(i2cx, flag)) {cnt++;if(cnt > TIMEOUT) return 1;}return 0;
}uint8_t I2C0_write(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t data_len) {uint8_t address = addr << 1;/************* start ***********************/// 等待I2C閑置if(I2C_waitn(I2C_FLAG_I2CBSY)) return 1;// starti2c_start_on_bus(i2cx);// 等待I2C主設備成功發送起始信號if(I2C_wait(I2C_FLAG_SBSEND)) return 2;/************* device address **************/// 發送設備地址i2c_master_addressing(i2cx, address, I2C_TRANSMITTER);// 等待地址發送完成if(I2C_wait(I2C_FLAG_ADDSEND)) return 3;i2c_flag_clear(i2cx, I2C_FLAG_ADDSEND);/************ register address ************/// 寄存器地址// 等待發送數據緩沖區為空if(I2C_wait(I2C_FLAG_TBE)) return 4;// 發送數據i2c_data_transmit(i2cx, reg);// 等待數據發送完成if(I2C_wait(I2C_FLAG_BTC)) return 5;/***************** data ******************/// 發送數據uint32_t i;for(i = 0; i < data_len; i++) {uint32_t d = data[i];// 等待發送數據緩沖區為空if(I2C_wait(I2C_FLAG_TBE)) return 6;// 發送數據i2c_data_transmit(i2cx, d);// 等待數據發送完成if(I2C_wait(I2C_FLAG_BTC)) return 7;}/***************** stop ********************/// stopi2c_stop_on_bus(i2cx);if(I2C_waitn(I2C_CTL0(i2cx)&I2C_CTL0_STOP)) return 8;return 0;
}uint8_t I2C0_write2(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t offset, uint32_t len) {uint8_t address = addr << 1;/************* start ***********************/// 等待I2C閑置if(I2C_waitn(I2C_FLAG_I2CBSY)) return 1;// starti2c_start_on_bus(i2cx);// 等待I2C主設備成功發送起始信號if(I2C_wait(I2C_FLAG_SBSEND)) return 2;/************* device address **************/// 發送設備地址i2c_master_addressing(i2cx, address, I2C_TRANSMITTER);// 等待地址發送完成if(I2C_wait(I2C_FLAG_ADDSEND)) return 3;i2c_flag_clear(i2cx, I2C_FLAG_ADDSEND);/************ register address ************/// 寄存器地址// 等待發送數據緩沖區為空if(I2C_wait(I2C_FLAG_TBE)) return 4;// 發送數據i2c_data_transmit(i2cx, reg);// 等待數據發送完成if(I2C_wait(I2C_FLAG_BTC)) return 5;/***************** data ******************/// 發送數據do {// 等待發送數據緩沖區為空if(I2C_wait(I2C_FLAG_TBE)) return 6;// 發送數據i2c_data_transmit(i2cx, *data);data += offset;// 等待數據發送完成if(I2C_wait(I2C_FLAG_BTC)) return 7;} while(--len);/***************** stop ********************/// stopi2c_stop_on_bus(i2cx);if(I2C_waitn(I2C_CTL0(I2C0)&I2C_CTL0_STOP)) return 8;return 0;
}void I2C0_deinit() {}uint8_t I2C0_read(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t len) {uint32_t i2cx = I2C0;uint8_t address = addr << 1;/************* start ***********************/// 等待I2C空閑if(I2C_waitn(I2C_FLAG_I2CBSY)) return 1;// 發送啟動信號i2c_start_on_bus(i2cx);if(I2C_wait(I2C_FLAG_SBSEND)) return 2;/************* device address **************/// 發送從設備寫地址i2c_master_addressing(i2cx, address, I2C_TRANSMITTER);if(I2C_wait(I2C_FLAG_ADDSEND)) return 3;i2c_flag_clear(i2cx, I2C_FLAG_ADDSEND);/********** register address **************/// 等待發送緩沖區	if(I2C_wait(I2C_FLAG_TBE)) return 4;// 發送寄存器地址i2c_data_transmit(i2cx, reg);// 等待發送數據完成	if(I2C_wait(I2C_FLAG_BTC)) return 5;	/************* start ***********************/// 發送再啟動信號i2c_start_on_bus(i2cx);if(I2C_wait(I2C_FLAG_SBSEND)) return 7;/************* device address **************/// 發送從設備讀地址i2c_master_addressing(i2cx, address + 1, I2C_RECEIVER);if(I2C_wait(I2C_FLAG_ADDSEND)) return 8;i2c_flag_clear(i2cx, I2C_FLAG_ADDSEND);/**************** 接收數據data *************///acki2c_ack_config(i2cx, I2C_ACK_ENABLE);// 接收一個數據后,自動發送ACKi2c_ackpos_config(i2cx, I2C_ACKPOS_CURRENT);// 確認ACK已啟用if(I2C_wait(I2C_CTL0(i2cx) & I2C_CTL0_ACKEN)) return 11;// 讀取數據uint32_t i;for (i = 0; i < len; i++) {if (i == len - 1) {// 在讀取最后一個字節之前,禁用ACK,配置為自動NACKi2c_ack_config(i2cx, I2C_ACK_DISABLE);}// 等待接收緩沖區不為空if(I2C_wait(I2C_FLAG_RBNE)) return 10;data[i] = i2c_data_receive(i2cx);}/***************************************//***************** stop ********************/i2c_stop_on_bus(i2cx);if(I2C_waitn(I2C_CTL0(i2cx)&I2C_CTL0_STOP)) return 12;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92893.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WinUI3開發_過渡動畫

簡介 過渡動畫是當發生事件時控件UI狀態發生改變時以一種動畫形式來演變到另外一種狀態&#xff0c;而非瞬間改變&#xff0c;使用一種更加平滑的方式來進行切換&#xff0c;例如下圖是文字切換的交叉柵欄效果&#xff1a;還有頁面切換動畫&#xff1a;在或者是圖標動畫&#x…

Linux下提權root權限

現在AI工具這么豐富&#xff0c;稍微搜一下就有一個差不多的總結輸出。但是&#xff0c;可能還不夠詳細&#xff0c;或者給得太多~~~今天時間關系&#xff0c;今天只總結了在Linux如何提權到root&#xff0c;并沒有寫如何進行防護。后面有時間&#xff0c;我再總結一下。命令實…

焊接機器人節能先鋒

汽車制造業中&#xff0c;機器人技術的應用已成為推動工業自動化和生產效率提升的重要力量。機器人在焊接、組裝、涂裝等關鍵制造環節中扮演著不可或缺的角色。隨著工業生產規模的不斷擴大&#xff0c;能源消耗和成本控制成為了企業必須面對的重大挑戰。尤其是工業焊接用氣的大…

MinIO:云原生對象存儲的終極指南

MinIO 是什么? MinIO 是一款高性能、云原生的對象存儲服務,具有以下優勢: 輕量級部署:采用 Go 語言編寫,資源占用低,支持快速部署 兼容性強:完全兼容 Amazon S3 API,輕松對接現有應用 高可用架構:支持分布式部署,確保數據持久性和服務可用性 高性能表現:專為云環境…

Spring AOP `MethodInvocation` 工作原理

?? 一、通知到 MethodInterceptor 的轉換機制 Spring AOP 通過適配器模式將開發者定義的注解型通知&#xff08;如 Before&#xff09;統一轉換為 MethodInterceptor 接口實現&#xff0c;確保所有通知類型能接入同一調用鏈。以下是轉換細節&#xff1a; 1. 適配器實現原理 核…

PPO原論文閱讀

一、Introduction1.目前存在的問題&#xff1a;(deep)Q-learning:在一些簡單問題上表現不佳&#xff0c;可理解性差基礎的policy gradient算法&#xff1a;&#xff08;如REINFORCE&#xff09;魯棒性差&#xff0c;需要大量數據TRPO&#xff1a;復雜&#xff0c;在包含噪音&am…

零基礎也能創作專屬歌曲:文心一言+蘑兔AI協同教程

在AI技術飛速發展的今天&#xff0c;音樂創作已不再是專業音樂人的專屬領域。通過文心一言與蘑兔AI的協同使用&#xff0c;即使沒有音樂基礎&#xff0c;也能輕松完成從歌詞創作到作曲編曲的全流程。本文將詳細拆解操作步驟&#xff0c;助你快速上手&#xff0c;實現音樂創作夢…

圖論:搜索問題

提到圖論中的搜索問題&#xff0c;首先想到的也就是DFS和BFS了&#xff0c;而提到這兩種搜索&#xff0c;那么最典型的題目就是島嶼問題了&#xff0c;下面就練習幾道相關的題目&#xff0c;為之后的更深奧的圖論學習打下基礎&#xff01; 孤島的總面積 題目鏈接&#xff1a;…

AI驅動攻防升級,API安全走到關鍵檔口

在數字化轉型與AI技術快速發展的雙重驅動下&#xff0c;API已成為企業業務與外部世界連接的神經中樞。然而&#xff0c;隨著API的深度應用&#xff0c;針對API的攻擊規模與復雜性也在持續升級。 API為何頻頻成為黑客重點盯防的突破口&#xff1f;企業常見的API防護手段是否還能…

網絡基礎DAY18-動態路由協議基礎

動態路由協議基礎知識回顧&#xff1a;1.什么是路由&#xff1f; 答&#xff1a;是三層設備轉發IP報文的路徑信息。 2.路由有哪些來源&#xff1f; 答&#xff1a;1.直連路由2.靜態路由3.動態路由 3.有直連路由的條件&#xff1f; 答&#xff1a;1.二層和三層物理接口狀態為UP …

axios統一封裝規范管理

新建/api/ 1.新建統一處理文件/api/axios.ts import axios from "axios"const http axios.create({baseURL: import.meta.env.VITE_API_BASE_URL, // 從環境變量讀取timeout: 10000, });// 請求攔截器&#xff08;如添加 Token&#xff09; http.interceptors.reque…

Java學習第七十四部分——Elasticsearch(ES)

目錄 一、前言提要 二、核心特性 三、應用場景 四、主要優勢 五、集成方式 六、基礎操作 七、高級特性 八、概念類比——與關系型數據庫 九、簡單示例——實現存儲與搜索 十、生態集成——基于Spring Data Elasticsearch 十一、性能優化建議 十二、總結歸納概述 一…

TDengine 轉化函數 TO_UNIXTIMESTAMP 用戶手冊

TDengine TO_UNIXTIMESTAMP 函數用戶使用手冊 函數概述 TO_UNIXTIMESTAMP 是 TDengine 中的標量函數&#xff0c;用于將符合 ISO8601/RFC3339 標準的日期時間字符串轉換為 Unix 時間戳。與 TO_TIMESTAMP 不同&#xff0c;該函數專門處理標準格式的時間字符串&#xff0c;無需指…

Java 中的排序算法詳解

目錄 一、冒泡排序&#xff08;Bubble Sort&#xff09; 原理? 二、選擇排序&#xff08;Selection Sort&#xff09; 原理? 三、插入排序&#xff08;Insertion Sort&#xff09; 原理? 四、快速排序&#xff08;Quick Sort&#xff09; 原理? 五、歸并排序&…

Gitee如何成為國內企業DevOps轉型的首選平臺?

Gitee如何成為國內企業DevOps轉型的首選平臺&#xff1f; 在數字化轉型浪潮中&#xff0c;DevOps已成為提升企業研發效能的關鍵引擎。作為國內領先的代碼托管與協作平臺&#xff0c;Gitee憑借本土化優勢與全流程支持能力&#xff0c;正成為越來越多企業DevOps實踐的核心載體。本…

?Excel——SUMPRODUCT 函數

SUMPRODUCT 是 Excel 中最強大的函數之一&#xff0c;可以用于 ?多條件求和、加權計算、數組運算? 等復雜場景。下面通過 ?基礎語法 實用案例? 徹底講透它的用法&#xff01;?一、基礎語法?SUMPRODUCT(數組1, [數組2], [數組3], ...)?功能?&#xff1a;將多個數組的對…

告別虛函數性能焦慮:深入剖析C++多態的現代設計模式

?? 引言:當多態遇上性能瓶頸 我經常被問到這樣一個問題:“既然virtual函數這么方便,為什么在一些高性能場景下,大家卻避之不及?” 答案很簡單:性能。 在我參與的多個HPC項目和游戲引擎開發中,virtual函數調用往往成為性能分析工具中最顯眼的那個紅點。一個看似無害…

k8s-MongoDB 副本集部署

前提準備一套 k8s 集群worker 節點上的 /nfs/data 目錄掛載到磁盤一、NFS 高可用方案&#xff08;NFSkeepalivedSersync&#xff09;本方案 NFS 的高可用方案&#xff0c;應用服務器為 Client &#xff0c;兩臺文件服務器分別 Master 和 Slave&#xff0c;使用 keepalived 生成…

BI 系統數據看板全解析:讓數據可視化驅動業務決策

BI 系統數據看板全解析&#xff1a;讓數據可視化驅動業務決策在 BI 系統中&#xff0c;數據看板是連接原始數據與業務洞察的 “橋梁”。它將零散的業務指標轉化為直觀的可視化圖表&#xff0c;讓產品經理、運營人員等角色能快速把握業務動態。一個設計精良的數據看板&#xff0…

圖機器學習(14)——社交網絡分析

圖機器學習&#xff08;14&#xff09;——社交網絡分析0. 前言1. 數據集分析1.1 數據集介紹1.2 使用 networkx 加載數據集2. 網絡拓撲和社區檢測2.1 網絡拓撲2.2 社區檢測0. 前言 社交網站的崛起是近年來數字媒體領域最活躍的發展趨勢之一&#xff0c;數字社交互動已經融入人…