轉整型_SPI轉can芯片CSM300詳解、Linux驅動移植調試筆記

一口君最近移植了一款SPI轉CAN的芯片CSM300A,在這里和大家做個分享。

一、CSM300概述

CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模塊。

1. 簡介

CSM300(A)系列隔離 SPI / UART 轉 CAN 模塊是集成微處理器、 CAN 收發器、 DC-DC 隔離電源、 信號隔離于一體的通信模塊, 該芯片可以很方便地嵌入到具有 SPI 或 UART 接口的設備中, 在不需改變原有硬件結構的前提下使設備獲得 CAN 通訊接口, 實現 SPI 設備或 UART 設備和 CAN 總線網絡之間的數據通訊。

外觀

6f480566735bb0ebd211771273dcfe5f.png
CSM300

2. 參數

  1. 實現 SPI 或 UART 與 CAN 接口的雙向數據通信;
  2. CAN 總線符合“ISO 11898-2”標準;
  3. 集成 1 路 SPI 接口, 支持用戶自定義的速率, 最高可達 1.5Mbit/s(非自定義協議轉換) ,或 1Mbit/s(自定義協議轉換) ;
  4. 集成 1 路 UART 接口, 支持多種速率, 最高可達 921600bps;
  5. 集成 1 路 CAN 通訊接口, 支持多種波特率, 最高可達 1Mbps;
  6. 隔離耐壓 2500VDC;
  7. 工作溫度:-40℃~+85℃;
  8. 電磁輻射 EME 較低;
  9. 電磁抗干擾 EMS 較高;
a03d576a803bac9d6299879e285bfafc.png
型號

如上圖所示 CSM300是5V工作電壓,CSM300A是3.3V工作電壓。

如果MCU、MPU側工作電壓不是1.8V那么就需要增加一個level shift來進行電壓轉換。

此次調試的板子使用的是CSM300A,只使用其中的SPI接口。

可以在如下搜索框中搜索需要的內容:

3. 引腳定義及參考電路

使用SPI轉CAN功能時, 需要將MODE引腳接至高電平。MCU的SPI接口與CSM300(A)的 SPI 接口連接,同時 MCU 需要提供 GPIO 與 RST、 INT、 CTL0、 CTL1 引腳連接,實現對 CSM300(A)的有效監測與控制。若需要通過 MCU 對CSM300(A)進行配置,則需要額外的 GPIO 與 CFG 引腳連接。

4998832c19073b9dd3f38ed47393bba2.png
SPI 轉 CAN 參考電路(CSM300A)

引腳說明:

4283fdc77b8e7978f3f54e4657fc2396.png
引腳說明

引腳功能說明如下:

  1. MODE腳直接接高電壓(高電平對應SPI模式,低電平對應UART模式);
  2. 10、11、12外接CAN總線,主要用于CAN通信;
  3. 3、6、7、24、19引腳接MCU/MPU,配置CSM300A的模式和讀寫操作都要依靠這幾個引腳;
  4. 18、21、22、23這4個引腳需要接到MCU/MPU的SPI控制器引腳,主要是CPU側發送配置信息和讀寫數據的SPI通路;
  5. 20 是INT引腳,CSM300A收到數據后,滿足一定條件就會下拉該引腳,產生中斷信號,通知CPU讀取數據。

二、工作模式

1. 工作模式分類

CSM300(A)上電后, MODE、 CFG 引腳電平會決定產品處于 4 種不同的工作模式的其中一種:SPI 轉 CAN 模式、 UART 轉 CAN 模式、 SPI 配置模式、 UART 配置模式。

90ec7e4edd57a83b65caa97e87e5a710.png
CSM300(A)工作模式

如上表所示:

  1. 如果我們要配置CSM300A,就是要設置CSM300A模式為SPI配置模式,那么就需要將MODE引腳置為1,CFG置為0,RST置為1;
  2. 如果我們要通過CSM300A讀寫數據,就是要設置CSM300A模式為SPI轉CAN模式,那么就需要將MODE引腳置為1,CFG置為1,RST置為1;
  3. 讀寫數據的操作,都屬于SPI轉CAN模式,不需要切換模式。
  4. 若需要切換產品的工作模式,更改引腳電平后,必須對產品進行復位,才能使其進入設 定的工作模式。需要注意的是,為保證成功復位, 復位保持時間最少為 100us,復位后, 產品初始化等待時間最少 3ms,待產品初始化完成后,才能進行正常操作。

下圖是不同模式切換的時序圖。

034263f02fb339736a197e76f947be37.png
工作模式切換時序

2. SPI 轉 CAN 模式(數據讀寫)

在此工作模式下, CSM300(A)始終作為 SPI 從機, SPI 限定工作在模式 3(CPOL、 CPHA 均為 1),數據長度限定為 8 位, MSB 高位先傳輸。透明轉換、透明帶標識轉換下最高通信 速率為 1.5Mbps,自定義協議轉換最高通信速率為 1Mbps。

SPI 主機可以發送數據至 CAN 總線端, 且可接收 CAN 總線端收到的數據。此時 UART 接口無效,不會處理任何出現在 UART 接口的數據,也不會返回 CAN 總線端接收到的數據 至 UART。

  1. SPI 幀 SPI 一次片選有效至片選無效之間的數據定義為一幀數據。幀與幀之間讀寫緩沖區數據應有 40us 的時間間隔。
ac8d68d87969072692dd228eec72ca1e.png
主機讀數據幀
b70266ccf00ea5e9f33ac2bf12014cd1.png
主機寫數據幀

3. SPI 配置模式

在此模式下, CSM300(A)處于等待配置狀態, 無法向 CAN 端發送或接收數據。此模式下僅能通過 SPI 接口進行配置。

三、主機控制

CSM300(A)有兩個 SPI 主機控制引腳 CTL0, CTL1, 受主機端控制。主機通過控制 CTL0, CTL1 引腳, 使 CSM300(A)進入不同的功能狀態,實現對 CSM300(A)不同操作目的。主機端控制引腳電平不同對應功能如下表所示:

7b68bdffdd705360adb69ce697c1e9fd.png
SPI 模式下主機控制功能

主機可以通過讀從機當前狀態來獲取產品當前可以讀取的字節數以及可以寫入的字節 數。主機將功能選擇為主機讀狀態,然后通過 SPI 讀出 4 個字節,即為狀態碼。狀態碼由 32 個位構成,具體定義如下表所示。

fda13e621af52cdd96e97165a6cd3bde.png
狀態碼

若定義 status[]數組為 8 位整型, 通過 SPI 讀狀態依次讀出的數據為 status[0]、 status[1]、 status[2]、 status[3],則其數據結構如下圖:

d07fffc0d5b935914120a4a3e771ed52.png
狀態字節數據結構

四、反饋機制(中斷)

CSM300(A)只能作為 SPI 從機,不能主動地控制其他 SPI 總線設備,所以如果接收CAN數據幀之后,必須主動返回給CPU側。

CSM300(A)硬件上的 INT 反饋引腳, 此引腳與主機連接,出現以下兩種情況時, INT 引腳會由高電平變成低電平,通知主機進行讀數據操作(為避免數據丟失,建議主機使用低 電平觸發方式檢測):

  1. CAN 緩沖區 CAN 幀數達到設置的觸發點時 當產品 CAN 總線端接收緩沖區接收到的 CAN 幀數達到觸發點時, INT 引腳電平置低, 直到緩沖區清空, INT 引腳才會恢復高電平。用戶可以在獲得 INT 信號之后查詢 CSM300(A) 的狀態,獲取可讀字節數,然后讀取緩沖區 CAN 數據。

  2. CAN 緩沖區數據少于觸發幀數,且在設定時間內主機未讀取時 CAN 緩沖區有數據但少于觸發幀數時,若總線長時間未有新增數據,且主機未進行讀 取操作時, CAN 接收緩沖區的數據將有可能長期得不到處理, 這就導致數據的實時性不高。為了解決少量數據的實時性問題, CSM300(A)內部設置了一個計時器,若 CAN 緩沖區的數 據在一定時間內未被讀取, 將觸發 INT 引腳置低,通知主機讀取數據。CSM300(A)在接收 到最后一幀數據時, 計時器啟動,主機進行讀取操作時復位計時器。

五、組網方式

CAN 總線一般使用直線型布線方式,總線節點數可達 110 個。布線推薦使用屏蔽雙絞線, CANH、 CANL 與雙絞線線芯連接, CGND 與屏蔽層連接,最后屏蔽層單點接地。

得益于 CSM300(A)的最低波特率 5kbps,總線的最長通信距離可達 10km。

23962dc7f5b70b8adaa7e505835e3180.png
推薦組網示意圖

六、移植

1. 硬件連接圖

e259424d17428384bc8f6454af0383ad.png
硬件連接圖

如上圖所示:

  1. SOC上已經集成了SPI控制器,廠家的sdk已經包含了spi控制器的設備樹和驅動信息;
  2. SOC的SPI控制器引腳需要先連接level shift進行升壓,板子電壓是1.8V,而CSM300要求電壓是3.3V;
  3. SOC的GPIO 76/107/113/114通過level shift分別連接CSM300A的RST/CFG/CTL1/CTL0;
  4. 在PC上運行CAN-Test軟件,可以通過USB轉CAN設備從CAN總線上讀取和發送數據。

【注】USB轉CAN設備,可以自行搜索,杜絕廣告。

2. 設備樹

以下是官方提供的設備樹:

csm300@0?{
?pinctrl-names?=?"default";
?pinctrl-0?=;
?gpios=21?0????/*ctl0*/
??&gpio3?22?0?/*ctl1*/
??&gpio3?30?0?/*rst*/
??&gpio3?31?0?/*cfg*/
?>;
?interrupt-parent?=?;
?interrupts?=?<26?IRQ_LEVEL_LOW>;
?compatible?=?"zhiyuan,csm300";
?spi-max-frequency?=?<500000>;
?reg?=?<1>;
?status?=?"okay";
};

以下是根據自己的平臺修改的結果,讀者移植的時候需要根據自己的平臺來移植,不可教條。

csm300@0?{
?pinctrl-names?=?"default";
?gpios=114?0????/*ctl0*/
??&gpio?113?0?/*ctl1*/
??&gpio?76?0?/*rst*/
??&gpio?107?0?/*cfg*/
?>;
?interrupt-parent?=?;
?interrupts?=?<196?IRQ_LEVEL_LOW>;
?compatible?=?"zhiyuan,csm300";
?spi-max-frequency?=?<500000>;
?reg?=?<0>;
?status?=?"okay";
};

3. 驅動

官方會提供驅動程序csm300.c,具體實際原理,本篇暫不討論。

拷貝到以下目錄:

drivers/net/can/spi

修改本級目錄下的Makefile

?obj-$(CONFIG_CAN_CSM300)?+=?csm300.o

修改本級目錄下的Kconfig

config?CAN_CSM300
?tristate?"Microchip?CSM300?driver"
?depends?on?SPI?
?---help---
???Driver?for?the?Microchip?CSM300??.

執行make menuconfig 驅動位置如下:c660ef56af5100c6ec1f2e3cfdaa07c5.png

選中該驅動:

4f44a2aadc447fbdfdba13b69bfc9b7f.png
menuconfig

重新編譯內核即可。

注意:該驅動還需要依賴CAN和SPI,一定要選上 。

4. 增加調試接口

在調試過程中,會有各種原因導致csm300驅動無法注冊成功,那如何判定是spi控制器驅動有問題,還是csm300驅動有問題呢?

為了方便通過spi控制器發送出波形,我們增加以下代碼,用于在板子目錄/sys/bus/spi/drivers/csm300中創建state文件節點,通過寫入不同的值來產生spi數據,或者控制RST、 CFG、 CTL0、 CTL1這4個引腳。

  1. 增加函數csm300_spi_store()
228b11361b794aed39619d0305449970.png
測試接口

重點說明一下函數**check_csm300()**是驅動自帶的用于測試CSM300的SPI通信功能的函數。

該函數會先將CSM300A設置為SPI配置模式,然后寫入9個數據,然后再讀取出數據,進行校驗數據是否正確。

  1. 修改probe函數
struct?net_device?*global_net?=?NULL?;
csm_probe()
{
?……
?global_net?=?net;
?ret?=?check_csm300(net);
?……
?ret?=?driver_create_file(&(csm300_can_driver.driver),&driver_attr_state);if(ret?0){
??ret?=?-ENOENT;
??goto?out_free;
?}
?……
}
  1. 測試命令 進入csm300模塊目錄
cd?/sys/bus/spi/drivers/csm300
  1. 產生spi數據
echo?3?>?state
  1. 拉高RST、 CFG、 CTL0、 CTL1
echo?1?>?state
  1. 拉低RST、 CFG、 CTL0、 CTL1
echo?0?>?state

5. 正確的開機log與波形

開機后驅動會調用check_csm300()來測試spi通道,發送的數據為F7:F8:02……

568cefd38a399ff2f436a358bd62a7ce.png
正確的開機log

以下為SPI接口的CLK和MOSI引腳的波形:

d138e0ef17fdc7bbcc7b43fe146649e8.png
開機SPI的波形

可以看到數據與我們發送的是一致的。

6. 接收數據波形圖

接收數據步驟如下:

  1. 運行于PC上的CAN Test 軟件發送數據 00 01 02 03 04 05 06 07,
  2. 經過USB轉CAN設備后,轉換成了差分信號,
  3. 到達CSM300A之后,信號被調制成矩形方波,
  4. CSM300A通過拉低引腳INT向cpu發送中斷信號,調用CSM300A注冊的中斷函數,
  5. 運行于CPU上的CSM300A中斷程序通過SPI接口讀走CSM300A上的數據,
  6. CSM300A緩沖區數據被讀走后,拉高INT,
  7. 驅動程序將接收到的數據上傳給應用層,于是candump命令得到了CAN幀的數據。
6f6ad321c16facc7ea44713326df94d4.png
接收數據流程

數據發送過程和上述過程類似。

7. CAN命令

如果文件系統中沒有can命令,需要自行移植。

1) 設置波特率并開啟can0口

ip?link?set?can0?up?type?can?bitrate?800000

2) 發送數據

cansend?can0?1F334455#1122334455667788

3) 查看接收的數據

candump?can0

七、出錯記錄

調試過程中遇到了很多的錯誤,CSM300A定位問題步驟:

  1. 首先用示波器測試CSM300的MOSI引腳的波形,是不是和第七章第5節的波形一致,如果不一致,說明SPI控制器驅動加載不正確;
  2. 要通過SPI控制器產生數據,使用命令echo 3 > state;
  3. 如果波形一致,就測量RST、 CFG、 CTL0、 CTL1這四個引腳,查看電平是否正確;
  4. RST、 CFG、 CTL0、 CTL1控制是否正確,可以用echo 0 > state、echo 1 > state分別拉低拉高,查看對這幾個引腳的控制是否正常。

基本上照著這個思路去調試很快就能定位到問題。

以下是驅動加載出錯的log,出錯的原因主要是調用check_csm300()函數向CSM300A寫入數據再讀取出來后數據不匹配,從而判定加載出錯。

a5210dd8228b88d84d16fee674f89f21.png
出錯log

1. CFG引腳拉低異常

現象:check_csm300()函數始終報錯。

分析:check不成功,基本上原因是SPI控制器與CSM300通信出了問題。首先用示波器,查看SPI發送的數據是否正常到達CSM300(用示波器抓取SSEL、CLK、MOSI),結果是正常的。

于是檢測檢測 RST、 CFG、 CTL0、 CTL1四個引腳。如下圖所示,使用echo 0 > state 拉低CFG引腳,發現沒有拉到0V。

4cca294bad7b72345dee58b0337715bb.png
在這里插入圖片描述

解決方案:

交給硬件工程師去改。這兄弟給CFG加了一個反向電阻,驅動部分需要將所有設置CFG的代碼,全部反置。

gpio_set_value(priv->CFG,0);
修改成
gpio_set_value(priv->RST,1);
gpio_set_value(priv->CFG,1);
修改成
gpio_set_value(priv->RST,0);

2. RST 延時不夠

現象:echo 0 > state 可以拉低,測量也是正確的,但是CSM300始終無法接收到數據幀。

分析:一般數據接收不到,有兩種可能:就是CSM300給出的中斷信號CPU沒有截取到,CSM300沒有處于SPI轉CAN模式。

先用示波器確定了,USB轉CAN的數據已經成功到達CSM300,于是檢測對應的引腳電平 RST、 CFG、 CTL0、 CTL1,發現也是對的。

檢查中斷計數,用cat /proc/interrupts查看CSM300是否有中斷計數,結果發現數據為0。

懷疑CSM300沒有rst成功,于是執行echo 3 > state,查看rst是否正確設置,結果發現以下波形,確定了該引腳拉高比較緩慢,所以CSM300采樣不到這個電平。

f28f9a649807f329530fdeb0dd3662df.png
在這里插入圖片描述

修改方法:驅動中每次rst操作,都要增加延遲時間:

gpio_set_value(priv->RST,0);
usleep_range(2000,2300);
gpio_set_value(priv->RST,1);

修改后,執行echo 3 > state,RST波形如下所示。

4cd08ed43340ba72568faccd242350bf.png
在這里插入圖片描述

10a8d09a729dd7f0b4b27972cd82611b.png

【1】CAN總線是如何通訊的?【2】什么是LIN總線?高速CAN、容錯CAN、LIN總線有什么區別?【3】CAN接口典型電路分析及應用【4】CAN總線通訊,如何處理GND【5】CAN總線通信典型電路(帶隔離)【6】SPI編程時,時鐘相位(CPHA)和時鐘極性(CPOL)怎么理解?

26abf6557ed69e0dd8cdf0e4174b0747.png

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

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

相關文章

matlab練習程序(二值圖像連通區域標記法,一步法)

這個只需要遍歷一次圖像就能夠完全標記了。我主要參考了WIKI和這位兄弟的博客&#xff0c;這兩個把原理基本上該介紹的都介紹過了&#xff0c;我也不多說什么了。一步法代碼相比兩步法真是清晰又好看&#xff0c;似乎真的比兩步法要好很多。 代碼如下&#xff1a; clear all; c…

pc微信不支持flash_在出售PC之前,如何取消對Flash內容的授權

pc微信不支持flashWhen it comes to selling your old digital equipment you usually should wipe it of all digital traces with something like DBAN, however if you can’t there are some precautions you should take–here’s one related to Flash content you may h…

博客在線——Wireshark基本用法

http://blog.jobbole.com/ http://blog.jobbole.com/70907/轉載于:https://www.cnblogs.com/zhongbokun/p/9709326.html

繪制三維散點圖_SPSS統計作圖教程:三維散點圖

作者&#xff1a;豆沙包&#xff1b;審稿&#xff1a;張耀文1、問題與數據最大攜氧能力是身體健康的一項重要指標&#xff0c;但檢測該指標成本較高。研究者想根據性別、年齡、體重、運動后心率等指標建立預測最大攜氧能力的模型&#xff0c;招募了100名研究對象&#xff0c;測…

【Python】插入sqlite數據庫

import sqlite3 from datetime import datetimeconn sqlite3.connect(data.db) print("Opened database successfully")for i in range(100):time datetime.now()conn.execute("INSERT INTO test(time,url,imgPath) VALUES (?,?,?)", (time, "ww…

java數組轉list(Arrays .asList)

習慣性的錯誤代碼&#xff1a; Integer[] intArr {1,2,3}; List<Integer> lst Arrays .asList(intArr); lst.add(4); 報UnsupportedOperationException異常&#xff0c;原因是Arrays .asList() 返回的固定大小的列表&#xff0c;無法進行add、remove等操作&#xff1b;…

使用lodash防抖_什么,lodash 的防抖失效了?

戳藍字「前端技術優選」關注我們哦&#xff01;作者&#xff1a;yeyan1996https://juejin.im/post/6892577964458770445應某人的要求被迫營業&#xff0c;望各位看官不要吝嗇手中的贊-。-背景在使用 uni-app 開發小程序時&#xff0c;有個填寫表單的需求&#xff0c;包含兩個輸…

Ubuntu 12.10中的8個新功能,Quantal Quetzal

Ubuntu 12.10 has been released and you can download it now. From better integration with web apps and online services to improvements in Unity, there are quite a few changes – although none of them are huge or groundbreaking. Ubuntu 12.10已發布&#xff0c…

背單詞APP調研分析

前言&#xff1a;隨著我國網絡經濟重心向移動端的轉移&#xff0c;移動教育領域獲得的關注度在持續放大。互聯網的發展和移動設備的普及&#xff0c;我們開始在移動設備上學習&#xff0c;各種學習教育軟件如雨后春筍&#xff0c;越來越多&#xff0c;就背單詞軟件來說&#xf…

linux 提取cpio_Linux提取RPM包文件(cpio命令)詳解

在講解如何從 RPM 包中提取文件之前&#xff0c;先來系統學習一下 cpio 命令。cpio 命令用于從歸檔包中存入和讀取文件&#xff0c;換句話說&#xff0c;cpio 命令可以從歸檔包中提取文件(或目錄)&#xff0c;也可以將文件(或目錄)復制到歸檔包中。歸檔包&#xff0c;也可稱為文…

cdh中使用hue使用教程_我可以在戶外使用Philips Hue燈泡嗎?

cdh中使用hue使用教程Philips Hue lights are great to have in your house, and they can add a lot of convenience to your living space. However, what if you want to use these smart bulbs outdoors in porch lights or flood lights? Will Philips Hue bulbs work pr…

django (三) admin后臺系統

admin后臺系統 1. 安裝MySQL 1,安裝mysql: sudo apt install mysql-server (安裝過程中輸入密碼并牢記) 2,安裝后進入mysql: mysql -u用戶名 -p密碼 mysql -uroot -proot ? 3,在Django中配置和使用mysql數據庫 使用mysql數據庫&#xff0c;settings中配置如下&#xff1a; DAT…

python博客訪問量_史詩級干貨-python爬蟲之增加CSDN訪問量

AI人工智能史詩級干貨-python爬蟲之增加CSDN訪問量史詩級干貨-python爬蟲之增加CSDN訪問量搜索微信公眾號:‘AI-ming3526’或者’計算機視覺這件小事’ 獲取更多算法、機器學習干貨csdn&#xff1a;https://blog.csdn.net/baidu_31657889/github&#xff1a;https://github.com…

弄斷過河電纜_你說的是:剪斷電纜線

弄斷過河電纜Earlier this week we asked you if you’d cut the cable and switched to alternate media sources to get your movie and TV fix. You responded and we’re back with a What You Said roundup. 本周早些時候&#xff0c;我們問您是否要切斷電纜并切換到其他媒…

復制粘貼的句子

Today you do things people will not do,tomorrow you will do things people can not do. 你今天做別人不愿做的事&#xff0c;明天就能做別人做不到的事。轉載于:https://www.cnblogs.com/wensens/p/9723998.html

路由銷毀上一頁_路由器原理(數據通信)

路由&#xff1a;對數據包選擇路徑的過程路由器(也叫網關)智能選擇數據傳輸路由的設備&#xff0c;其端口數量較少&#xff01;功能&#xff1a;連接網絡1.連接異構網絡以太網、ATM網絡、FDDI網絡2.連接遠程網絡局域網、廣域網隔離廣播將廣播隔離在局域網內路由選擇網絡安全地址…

您可能沒有使用的最佳三星Galaxy功能

Samsung packs its flagship phones with a slew of features—some are even better than stock Android. Either way, there are a lot of things on these phones that you may not be using. Here are some of the best. 包三星旗艦手機用的特性-擺有的甚至比普通的Android…

win7更新錯誤0x800b0109_win7更新漏洞后產生0x0000006B藍屏的解決方法圖解

這幾天不少網友在使用win7更新補丁后就藍屏了&#xff0c;代碼為0x0000006b。發生這一藍屏問題的都是安裝了2016年四月份推出的安全更新補丁&#xff0c;安裝后就出現藍屏&#xff0c;有的網友表示沒問題&#xff0c;有的直接藍了。這個藍屏重啟后依舊&#xff0c;安全模式進不…

獲取構造器的信息

獲取類構造器的用法與上述獲取方法的用法類似&#xff0c;如&#xff1a; import java.lang.reflect.*;public class constructor1 {public constructor1() {}protected constructor1(int i, double d) { } public static void main(String args[]) { try { Class cls Class.f…

如何使用facebook_如果每個人都已經開始使用Facebook,Facebook能否繼續發展?

如何使用facebookThere are only so many people on earth, and so many hours in the day. Is that starting to limit the growth of social media? 地球上只有那么多人&#xff0c;一天中有很多小時。 這是否開始限制社交媒體的增長&#xff1f; Think about how much time…