㈠ i2c和i2s
I2S(Inter-IC Sound Bus)是飛利浦公司頌燃為數字音頻設備之間的音頻 數據傳輸而制定的一種匯流排標准。
i2c(發音為:」I squared see」)能用於替代標準的並行匯流排,能連接的各種集成電路和功能模塊。I2C是多主控匯流排,所以任何一個設備都能像主控器一樣工作,並控制匯流排。匯流排上每一個設備都有一個獨一無二的地址,根據設備它們自己的並唯能力,它們可以作為發射器或接收器工作。多路微野蔽虛控制器能在同一個I2C匯流排上共存。
㈡ 關於I2C程序
AT的沒有具體去看他的daatsheep
一般的 24都是允許一次性全部讀出的只要你的時序沒有問題
另外ack信號遲一專點發送屬 不會影響讀寫的
你可以仔細看一下 at的 daatsheep看有沒有256位元組的限制.
普通的24是01-128位元組 02=256位元組...16=2047位元組..
超過部分..器件會自動回到0地址處理,
/////////////////////////////////////////////
看了一下你,後面添加的程序.
如果你這樣寫.那麼read_all那邊就不需要用參數了.
因為如果讀取,一般都是從0開始讀取的..
另外x24c08_read如果是單位元組讀寫函數.而且是正確的話
那麼用
for (ii=0;ii<4;ii++)
{
for (iii=0;iii<256;iii++)
{
c=x24c08_read(ii,(uchar)iii);
SBUF=c;
while (!TI);
這種方式的讀取一定是沒有問題.
有問題就是你的代碼..或者你的eep本身壞了.
如果你感覺時許地上對的話..不妨看一下.
//////////////////////////////////
㈢ QN8027晶元的I2C通信過程
QN8027是使用於攜帶型設備高性能數字調頻發射晶元。
為了設計一襲閉歷台拍搜數字式的FM發射系統,我們首先需要了解一下這顆晶元與MCU的工作過程。
左右模擬音頻信號輸入後經過VGA的調整,由兩個高解析度ADC采樣數字化。預加重和MPX進行編碼。如果RDS寄存器使能時,RDS信號也將與MPX信號和混合,組合的輸出將被饋送到一個數字FM調制器,隨後將FM信號載波為RF。然後對RF信號進行濾波,並通過功率放大器放大。
其中,IC與MCU的通信態纖使用I2C通信協議來完成。
㈣ 兩個51單片機如何通過i2c通訊
一般情況下,要進行I2C通訊,你最起碼其中有一個晶元要本身就帶有I2C通訊介面,用這個帶有I2C介面的晶元來作從器件,這樣就相返巧對好處理一點。你要是兩個都不帶這個介面,來模擬的話,很有難度。除非你對I2C協議很清楚,不過從樓主的提問來看,估計就不怎麼熟悉這種協議。
所以建議還是用別的通訊方式吧,比如用SPI,相對會好處理一點,用其中一個晶元的INTx來模擬CS介面,作為從器件在中斷中來處理,另外一個就模擬主器羨豎件來控制從器件,這樣或許會好弄點。如果樓主確實需要通訊,還是趕快換個思路吧,要是卡在一個地方動不了,會耽誤你的進程的兄世大,祝你好運!
㈤ 如何寫linux的I2C驅動,更具體的是加密晶元at88sc0104c的驅動
直接在應用空間寫吧,驅動的話要復雜點,會給你增加難度的。
在應用空間用/dev/i2cdev 來訪問i2c 設備的例子,你直接 吧。
加密晶元的話,一般廠家都有支持代碼的吧,不過不一定是linux 平台的,你把訪問i2c 的那部分改改就成了。
㈥ 什麼是I2C,I2C有什麼作用
I²C(Inter-Integrated Circuit)是內部整合電路的稱呼,是一種串列通訊匯流排,使用多主從架構,由飛利浦公司在1980年代為了讓主板、嵌入式系統或手機用以連接低速周邊裝置而發展。I²C(讀作"I-squared-C" ),還有可選的拼寫方式是I2C(讀作I-two-C)以及IIC(讀作I-I-C),在中國則多以"I方C"稱之。
I2C(Inter-Integrated Circuit)匯流排是由PHILIPS公司開發的兩線式串列匯流排,用於連接微控制器及其外圍設備。是微電子通信控制領域廣泛採用的一種匯流排標准。它是同步通信的一種特殊形式,具有介面線少,控制方式簡單,器件封裝形式小,通信速率較高等優點。I2C 匯流排支持任何IC 生產過程(CMOS、雙極性)慎孝。通過串列數據(SDA)線和串列時鍾 (SCL)線在連接到匯流排的器件間傳遞信息。每個器件都有一個唯一的地址識別(無論是微控制器——MCU、LCD 驅動器、存儲器或鍵盤介面),而且都可以作為一個發送器或接收器(由器件的功能決定)。LCD 驅動器只能作為接收器,而存儲器則既可以接收又可以發送數據。除了發送器和接收器外,器件在執行數據傳輸時也可以被看作是主機或從機(見表1)。主機是初始化匯流排的數據傳輸並產生允許傳輸的時鍾信號的器件。此時,任何被定址的器件都被認為是從機。
特徵:
畝吵1、只要求兩條匯流排線路:一條串列數據線SDA,一條串寬耐稿行時鍾線SCL;
2、每個連接到匯流排的器件都可以通過唯一的地址和一直存在的簡單的主機/從機關系軟體設定地址,主機可以作為主機發送器或主機接收器;
3、它是一個真正的多主機匯流排,如果兩個或更多主機同時初始化,數據傳輸可以通過沖突檢測和仲裁防止數據被破壞;
4、串列的8 位雙向數據傳輸位速率在標准模式下可達100kbit/s,快速模式下可達400kbit/s,高速模式下可達3.4Mbit/s;
5、連接到相同匯流排的IC 數量只受到匯流排的最大電容400pF 限制。
㈦ I2C介面4/5/6/7/8/9/10/12/16鍵低功耗抗干擾觸摸觸控IC(晶元)-VK36N4-10/12/16I
VK36N4I/5I/6I/7I/8I/9I/10I/12I/16I對應4-10/12/16鍵觸摸按鍵,可用來檢測外部觸摸卜此擾按鍵上人手的觸摸動作。該晶元具有較高的集成度,僅需極少的外部組件便可實現觸摸按鍵的檢測。晶元內部採用特殊的集成電路,具有高電源電壓抑制比,可減少按鍵檢測錯誤的發生,此特性保證在不利環境條件的應用中晶元仍具有很高的可靠性。具有自動校準功能,低待機電流,抗電壓波動等特性,為各種觸摸按鍵+IO輸出的應用提供了一種簡單而又有效的實現方法。
特性: 工作電壓:2.2V~5.5V&nBSP(Q361/888/5898); 低待機電流10uA/3V 低壓重置(LVR)電壓2.0V 4S自動校準功能 可靠的觸摸按鍵檢測 無鍵按下4S進入待機模式 防呆功能長按10S復位 具備抗電壓波動功能 I2C輸出+INT中斷腳 專用管腳外接電容(1nF-47nF)調整靈敏度OPT管腳選擇輸出低有效還是高有效 極少的外圍組件
VK36N4I/5/6/7/8/9/10I是內建LDO高靈敏度低功耗且抗干擾的觸摸IC
————————————
觸摸觸控IC系列簡介如下:標准觸控IC-電池供電系列:
VKD223EB ---
工作電壓/電流:2.0V-5.5V/5uA-3V 感應通道數:1 通訊介面最長響應時間快速模式60mS,低功耗模式220ms 封裝:SOT23-6
VKD223B ---
工作電壓/電流:2.0V-5.5V/5uA-3V 感應通道數:1 通訊介面最長響應時間快速模式60mS,低功耗模式220ms 封裝:SOT23-6
VKD233DB ---
工作電壓/電流:2.4V-5.5V/2.5uA-3V 1感應按鍵 封裝:SOT23-6
通訊介面:直接輸出,鎖存(toggle)輸出 低功耗模式電流2.5uA-3V
VKD233DH ---
工作電壓/電流:2.4V-5.5V/2.5uA-3V 1感應按鍵 封裝:SOT23-6
通訊介面:直接輸出,鎖存(toggle)輸出 有效鍵最長時間檢測16S
VKD233DS ---
工作電壓/電流:2.4V-5.5V/2.5uA-3V 1感應按鍵 封裝:DFN6(2*2超小封裝)通訊介面:直接輸出,鎖存(toggle)輸出 低功耗模式電流2.5uA-3V
VKD233DR ---
工作電壓/電流:2.4V-5.5V/1.5uA-3V 1感應按鍵 封裝:DFN6(2*2超小封裝)通訊介面:直接輸出,鎖存(toggle)輸出 低功耗模式電流1.5uA-3V
VKD233DG ---
工作電壓/型旦電流:2.4V-5.5V/2.5uA-3V 1感應按鍵 封裝:DFN6(2*2超小封裝)通訊介面:直接輸出,鎖存(toggle)輸出 低功耗模式電流2.5uA-3V
VKD233DQ ---
工作電壓/電流:2.4V-5.5V/5uA-3V 1感應按鍵 封裝:SOT23-6
通訊介面:直接輸出,扒毀鎖存(toggle)輸出 低功耗模式電流5uA-3V
VKD233DM ---
工作電壓/電流:2.4V-5.5V/5uA-3V 1感應按鍵 封裝:SOT23-6 (開漏輸出)通訊介面:開漏輸出,鎖存(toggle)輸出 低功耗模式電流5uA-3V
VKD232C ---
工作電壓/電流:2.4V-5.5V/2.5uA-3V
感應通道數:2 封裝:SOT23-6
通訊介面:直接輸出,低電平有效 固定為多鍵輸出模式,內建穩壓電路
MTP
觸摸IC——VK36N系列抗電源輻射及手機干擾:
VK3601L ---
工作電壓/電流:2.4V-5.5V/4UA-3V3 感應通道數:1 1對1直接輸出待機電流小,抗電源及手機干擾,可通過CAP調節靈敏 封裝:SOT23-6
VK36N1D ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:1 1對1直接輸出觸摸積水仍可操作,抗電源及手機干擾,可通過CAP調節靈敏封裝:SOT23-6
VK36N2P ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:2 脈沖輸出觸摸積水仍可操作,抗電源及手機干擾,可通過CAP調節靈敏封裝:SOT23-6
VK3602XS ---
工作電壓/電流:2.4V-5.5V/60UA-3V 感應通道數:2 2對2鎖存輸出低功耗模式電流8uA-3V,抗電源輻射干擾,寬供電電壓 封裝:SOP8
VK3602K ---
工作電壓/電流:2.4V-5.5V/60UA-3V 感應通道數:2
2對2直接輸出低功耗模式電流8uA-3V,抗電源輻射干擾,寬供電電壓 封裝:SOP8
VK36N2D ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:2 1對1直接輸出觸摸積水仍可操作,抗電源及手機干擾,可通過CAP調節靈敏封裝:SOP8
VK36N3BT ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:3 BCD碼鎖存輸出觸摸積水仍可操作,抗電源及手機干擾,可通過CAP調節靈敏 封裝:SOP8
VK36N3BD ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:3 BCD碼直接輸出觸摸積水仍可操作,抗電源及手機干擾,可通過CAP調節靈敏 封裝:SOP8
VK36N3BO ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:3 BCD碼開漏輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP8/DFN8(超小超薄體積)
VK36N3D ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:3 1對1直接輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N4B ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:4 BCD輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N4I---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:4 I2C輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N5D ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:5
1對1直接輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N5B ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:5 BCD輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N5I ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:5 I2C輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N6D ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:6
1對1直接輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N6B ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:6 BCD輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N6I ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:6 I2C輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N7B ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:7 BCD輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N7I ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:7 I2C輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N8B ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:8 BCD輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N8I ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:8 I2C輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N9I ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:9 I2C輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
VK36N10I ---
工作電壓/電流:2.2V-5.5V/7UA-3V3 感應通道數:10 I2C輸出觸摸積水仍可操作,抗電源及手機干擾 封裝:SOP16/DFN16(超小超薄體積)
1-8
點高靈敏度液體水位檢測IC——VK36W系列
VK36W1D ---
工作電壓/電流:2.2V-5.5V/10UA-3V3 1對1直接輸出 水位檢測通道:1
可用於不同壁厚和不同水質水位檢測,抗電源/手機干擾封裝:SOT23-6
備註:1. 開漏輸出低電平有效 2、適合需要抗干擾性好的產品應用
VK36W2D ---
工作電壓/電流:2.2V-5.5V/10UA-3V3 1對1直接輸出 水位檢測通道:2
可用於不同壁厚和不同水質水位檢測,抗電源/手機干擾封裝:SOP8
備註:1. 1對1直接輸出 2、輸出模式/輸出電平可通過IO選擇
VK36W4D ---
工作電壓/電流:2.2V-5.5V/10UA-3V3 1對1直接輸出 水位檢測通道:4
可用於不同壁厚和不同水質水位檢測,抗電源/手機干擾封裝:SOP16/DFN16
備註:1. 1對1直接輸出 2、輸出模式/輸出電平可通過IO選擇
VK36W6D ---
工作電壓/電流:2.2V-5.5V/10UA-3V3 1對1直接輸出 水位檢測通道:6
可用於不同壁厚和不同水質水位檢測,抗電源/手機干擾封裝:SOP16/DFN16
備註:1. 1對1直接輸出 2、輸出模式/輸出電平可通過IO選擇
VK36W8I ---
工作電壓/電流:2.2V-5.5V/10UA-3V3 I2C輸出 水位檢測通道:8
可用於不同壁厚和不同水質水位檢測,抗電源/手機干擾封裝:SOP16/DFN16
備註:1. IIC+INT輸出 2、輸出模式/輸出電平可通過IO選擇
——————————————————————————
LCD/LED
液晶控制器及驅動器系列晶元簡介如下:
RAM
映射LCD控制器和驅動器系列:
VK1024B 2.4V
~5.2V
6seg*4com 6*3 6*2
偏置電壓1/2 1/3 S0P-16
VK1056B 2.4V
~5.2V 14seg*4com
14*3 14*2 偏置電壓1/2 1/3 SOP-24/SSOP-24
VK1072B 2.4V
~5.2V 18seg*4com
18*3 18*2 偏置電壓1/2 1/3 SOP-28
VK1072C 2.4V
~5.2V 18seg*4com 18*3 18*2
偏置電壓1/21/3 SOP-28
VK1088B 2.4V
~5.2V 22seg*4com 22*3
偏置電壓1/2 1/3 QFN-32L(4MM*4MM)
VK0192 2.4V
~5.2V 24seg*8com
偏置電壓1/4 LQFP-44
VK0256 2.4V
~5.2V 32seg*8com
偏置電壓1/4 QFP-64
VK0256B 2.4V
~5.2V 32seg*8com
偏置電壓1/4 LQFP-64
VK0256C 2.4V
~5.2V 32seg*8com
偏置電壓1/4 LQFP-52
VK1621 2.4V
~5.2V 32*4 32*3 32*2 偏置電壓1/2 1/3 LQFP44/48/SSOP48/SKY28/DICE裸片
VK1622 2.7V
~5.5V 32seg*8com
偏置電壓1/4
LQFP44/48/52/64/QFP64/DICE裸片
VK1623 2.4V
~5.2V 48seg*8com
偏置電壓1/4
LQFP-100/QFP-100/DICE裸片
VK1625 2.4V
~5.2V 64seg*8com
偏置電壓1/4 LQFP-100/QFP-100/DICE
VK1626 2.4V
~5.2V 48seg*16com
偏置電壓1/5 LQFP-100/QFP-100/DICE
(
高品質 高性價比:液晶顯示驅動IC 原廠直銷 工程技術支持!)
高抗干擾LCD液晶控制器及驅動系列:
VK2C21A 2.4
~5.5V 20seg*4com 16*8
偏置電壓1/3 1/4 I2C通訊介面SOP-28
VK2C21B 2.4
~5.5V 16seg*4com 12*8
偏置電壓1/3 1/4 I2C通訊介面SOP-24
VK2C21C 2.4
~5.5V 12seg*4com 8*8
偏置電壓1/3 1/4 I2C通訊介面SOP-20
VK2C21D 2.4
~5.5V 8seg*4com
4*8 偏置電壓1/3 1/4 I2C通訊介面SOP-16
VK2C22A 2.4
~5.5V 44seg*4com
偏置電壓1/2
1/3 I2C通訊介面LQFP-52
VK2C22B 2.4
~5.5V 40seg*4com
偏置電壓1/2 1/3 I2C通訊介面LQFP-48
VK2C23A 2.4
~5.5V 56seg*4com 52*8
偏置電壓1/3 1/4 I2C通訊介面LQFP-64
VK2C23B 2.4
~5.5V 36seg*8com
偏置電壓1/31/4 I2C通訊介面LQFP-48
VK2C24 2.4
~5.5V 72seg*4com 68*8
60*16 偏置電壓1/3 1/4 1/5 I2C通訊介面LQFP-80
[if !supportLineBreakNewLine]
[endif]
超低功耗LCD液晶控制器及驅動系列:
VKL060 2.5
~5.5V 15seg*4com
偏置電壓1/2
1/3 I2C通訊介面SSOP-24
VKL128 2.5
~5.5V 32seg*4com
偏置電壓1/2
1/3 I2C通訊介面LQFP-44
VKL144A 2.5
~5.5V 36seg*4com
偏置電壓1/2 1/3 I2C通訊介面TSSOP-48
VKL144B 2.5
~5.5V 36seg*4com
偏置電壓1/2 1/3 I2C通訊介面QFN48L (6MM*6MM)
靜態顯示LCD液晶控制器及驅動系列:
VKS118 2.4
~5.2V 118seg*2com
偏置電壓 --
4線通訊介面LQFP-128
VKS232 2.4
~5.2V 116seg*2com
偏置電壓1/1 1/2 4線通訊介面LQFP-128
永嘉微電/VINKA,工程服務技術支持,主營LCD/LED驅動IC/觸摸IC
____________________________________________________________________
內存映射的LED控制器及驅動器:
VK1628 ---
通訊介面:STB/CLK/DIO 電源電壓:5V(4.5~5.5V) 驅動點陣:70/52 共陰驅動:10段7位/13段4位 共陽驅動:7段10位 按鍵:10x2 封裝SOP28
VK1629 ---
通訊介面:STB/CLK/DIN/DOUT 電源電壓:5V(4.5~5.5V) 驅動點陣:128共陰驅動:16段8位 共陽驅動:8段16位 按鍵:8x4 封裝QFP44
VK1629A ---
通訊介面:STB/CLK/DIO 電源電壓:5V(4.5~5.5V) 驅動點陣:128共陰驅動:16段8位 共陽驅動:8段16位 按鍵:--- 封裝SOP32
VK1629B ---
通訊介面:STB/CLK/DIO 電源電壓:5V(4.5~5.5V) 驅動點陣:112 共陰驅動:14段8位 共陽驅動:8段14位 按鍵:8x2 封裝SOP32
VK1629C ---
通訊介面:STB/CLK/DIO 電源電壓:5V(4.5~5.5V) 驅動點陣:120 共陰驅動:15段8位 共陽驅動:8段15位 按鍵:8x1 封裝SOP32
VK1629D ---
通訊介面:STB/CLK/DIO 電源電壓:5V(4.5~5.5V) 驅動點陣:96 共陰驅動:12段8位 共陽驅動:8段12位 按鍵:8x4 封裝SOP32
VK1640 ---
通訊介面: CLK/DIN 電源電壓:5V(4.5~5.5V) 驅動點陣:128共陰驅動:8段16位 共陽驅動:16段8位 按鍵:--- 封裝SOP28
VK1650 ---
通訊介面: SCL/SDA 電源電壓:5V(3.0~5.5V) 驅動點陣:8x16共陰驅動:8段4位 共陽驅動:4段8位 按鍵:7x4 封裝SOP16/DIP16
VK1668 ---
通訊介面:STB/CLK/DIO 電源電壓:5V(4.5~5.5V) 驅動點陣:70/52共陰驅動:10段7位/13段4位 共陽驅動:7段10位 按鍵:10x2 封裝SOP24
VK6932 ---
通訊介面:STB/CLK/DIN 電源電壓:5V(4.5~5.5V) 驅動點陣:128共陰驅動:8段16位17.5/140mA 共陽驅動:16段8位 按鍵:--- 封裝SOP32
VK16K33 ---
通訊介面:SCL/SDA 電源電壓:5V(4.5V~5.5V) 驅動點陣:128/96/64 共陰驅動:16段8位/12段8位/8段8位 共陽驅動:8段16位/8段12位/8段8位按鍵:13x3 10x3 8x3 封裝SOP20/SOP24/SOP28
㈧ 誰有觸控晶元BS8112A控制代碼
轉來的
#include "stm32f0xx.h"
void I2C_INT_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line5;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource5);
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_15_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority=2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void I2C_SDACL_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10, GPIO_AF_4);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4);
}
void ZLG_24C_Init(void)
{
I2C_InitTypeDef I2C_InitStructure;
I2C_INT_Init();
I2C_SDACL_Init();
RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;
I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;
//I2C_InitStructure.I2C_Ack=I2C_Ack_Disable;
I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_DigitalFilter = 0x00;
I2C_InitStructure.I2C_OwnAddress1=0x00;
//I2C_InitStructure.I2C_Timing=0x30E32E44;
I2C_InitStructure.I2C_Timing=0x20D22E37;
I2C_InitStructure.I2C_AnalogFilter=I2C_AnalogFilter_Enable;
I2C_Init(I2C1,&I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);
// ZLG_24C_Read(0xA0,0x08);
}
uint8_t ZLG_24C_Read(uint8_t addr1, uint8_t addr2)
{
uint8_t data;
uint16_t i;
i=0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET)
{
i++;
if(i>600) return 0;
}
I2C_TransferHandling(I2C1, addr1, 1, I2C_SoftEnd_Mode,I2C_Generate_Start_Write);
i=0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)
{
i++;
if(i>600) return 0;
}
I2C_Senddata(I2C1, addr2);
i=0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET)
{
i++;
if(i>600) return 0;
}
I2C_TransferHandling(I2C1, addr1, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
i=0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET)
{
i++;
if(i>600) return 0;
}
data=I2C_Receivedata(I2C1);
i=0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET)
{
i++;
if(i>600) return 0;
}
i=0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) != RESET)
{
i++;
if(i>600) return 0;
}
return(data);
}
void ZLG_24C_Write(uint8_t addr1,uint8_t addr2,uint8_t data)
{
uint16_t i;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);
I2C_TransferHandling(I2C1, addr1, 2, I2C_AutoEnd_Mode,I2C_Generate_Start_Write);
i=0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)
{
i++;
if(i>600) return;
}
I2C_Senddata(I2C1, addr2);
i=0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)
{
i++;
if(i>600) return;
}
I2C_Senddata(I2C1, data);
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
}
void EXTI4_15_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5)!=RESET)
{
settableflag(Flag_getkey,0);
//riar=1;
}
EXTI_ClearITPendingBit(EXTI_Line5);
}
㈨ AT89s51模擬I2C主從機問題代碼,求高手幫助
從機的代碼沒派叢納有那麼塵沒簡單的,從機要時刻監視SDA與SCL上的電平,還要判斷電平變化時的時間間隔。
你可以先鄭氏把主機的代碼調好,再來調從機的代碼。
調主機時,可以用24C01這些類似的晶元作為從機來調試。
㈩ 求解51單片機I2C對24c02讀寫匯編程序
ORG 0000H
LJMP MAIN
SCL BIT P2.1
SDA BIT P2.0
TEMP EQU 30H
BYTE_ADDR EQU 31H
;---------------I2C通訊程序----------------
;------------------------------------------
;---------------讀取I2C數據----------------
;讀取一個位元組
;輸入:BYTE_ADDR,讀取位元組地址
;輸出:A
;------------------------------------------
I2CREAD:
LCALL I2C_START ;起始
MOV A,#0A0H
LCALL I2C_TXBYTE ;發送晶元地址數據+寫信號
LCALL I2C_RXACK ;接收ACK
MOV A,BYTE_ADDR
LCALL I2C_TXBYTE ;發送RAM地址數據
LCALL I2C_RXACK ;接收ACK
LCALL I2C_START ;起始
MOV A,#0A1H
LCALL I2C_TXBYTE ;發送地址數據+讀信號
LCALL I2C_RXACK ;接收ACK
LCALL I2C_RXBYTE ;接收數據
SETB C ;讀一個位元組C=1
LCALL I2C_TXACK ;發送NAK
LCALL I2C_STOP ;讀取完成
RET
;----------------------------
;R4=讀出位元組數
;BYTE_ADDR=讀出初始地址
;R1=數據指針
;----------------------------
I2C_PAGE_RD:
LCALL I2C_START ;起始
MOV A,#0A0H
LCALL I2C_TXBYTE ;發送晶元地址數據+寫信號
LCALL I2C_RXACK ;接收ACK
MOV A,BYTE_ADDR
LCALL I2C_TXBYTE ;發送RAM地址數據
LCALL I2C_RXACK ;接收ACK
LCALL I2C_START ;起始
MOV A,#0A1H
LCALL I2C_TXBYTE ;發送地址數據+讀信號
LCALL I2C_RXACK ;接收ACK
NXT_BYTE:
LCALL I2C_RXBYTE ;接收數據
MOV @R1,A
INC R1
CLR C ;連續讀C=0
LCALL I2C_TXACK ;發送NAK
LCALL I2C_DELAY
DJNZ R4,NXT_BYTE
LCALL I2C_NOACK ;NOACK
LCALL I2C_STOP ;讀取完成
RET
;----------------寫一位元組I2C數據------------
;寫入一個位元組
;輸入:BYTE_ADDR,寫入位元組地址;A=寫入數據
;輸出:無
;------------------------------------------
I2CWRITE:
PUSH ACC
LCALL I2C_START ;開始寫
MOV A,#0A0H
LCALL I2C_TXBYTE ;發送地址數據+寫信號
LCALL I2C_RXACK ;接收ACK
MOV A,BYTE_ADDR
LCALL I2C_TXBYTE ;發送RAM地址數據
LCALL I2C_RXACK ;接收ACK
POP ACC
LCALL I2C_TXBYTE ;寫數據
LCALL I2C_RXACK ;接收ACK
LCALL I2C_STOP ;寫完成
LCALL I2C_DLYMS ;延時1ms
RET
;----------------------------
;R4=寫入位元組數
;BYTE_ADDR=寫入初始地址
;R1=數據指針
;----------------------------
I2C_PAGE_WR:
LCALL I2C_START ;開始寫
MOV A,#0A0H
LCALL I2C_TXBYTE ;發送地址數據+寫信號
LCALL I2C_RXACK ;接收ACK
MOV A,BYTE_ADDR
LCALL I2C_TXBYTE ;發送RAM地址數據
LCALL I2C_RXACK ;接收ACK
NEXT_DATA: ;WRITE 16 BYTES TO
MOV A,@R1 ;EEPROM
LCALL I2C_TXBYTE ;寫數據
LCALL I2C_RXACK ;接收ACK
INC R1
DJNZ R4,NEXT_DATA
LCALL I2C_STOP ;寫完成
LCALL I2C_DLYMS ;延時1ms
RET
;----------------------------
;發送I2C起始信號
;----------------------------
I2C_START:
SETB SCL ;時鍾高電平時數據下降沿為啟動信號
LCALL I2C_DELAY
SETB SDA
LCALL I2C_DELAY
CLR SDA ;數據線下降沿
LCALL I2C_DELAY ;延時
CLR SCL ;時鍾->低
LCALL I2C_DELAY ;延時
RET
;----------------------------
;發送I2C停止信號
;----------------------------
I2C_STOP:
CLR SDA
LCALL I2C_DELAY ;延時
SETB SCL ;時鍾->高
LCALL I2C_DELAY ;延時
SETB SDA ;數據線上升沿
LCALL I2C_DELAY ;延時
CLR SCL
RET
;----------------------------
;發送ACK/NAK信號
;----------------------------
I2C_TXACK:
MOV SDA,C ;送ACK數據
LCALL I2C_DELAY ;延時
SETB SCL ;時鍾->高
LCALL I2C_DELAY ;延時
CLR SCL ;時鍾->低
LCALL I2C_DELAY ;延時
SETB SDA ;發送完成
RET
;----------------------------
;接收ACK/NAK信號
;----------------------------
I2C_RXACK:
SETB SDA ;准備讀數據
LCALL I2C_DELAY ;延時
SETB SCL ;時鍾->高
LCALL I2C_DELAY ;延時
MOV C,SDA ;讀取ACK信號
CLR SCL ;時鍾->低
LCALL I2C_DELAY ;延時
RET
;----------------------------
I2C_NOACK:
SETB SDA ;NO ACKNOWLEDGE
LCALL I2C_DELAY
SETB SCL
LCALL I2C_DELAY
CLR SCL
LCALL I2C_DELAY
RET
;----------------------------
;發送一位元組數據
;----------------------------
I2C_TXBYTE:
MOV R7,#8 ;8位計數
TXNEXT:
RLC A ;移出數據位
MOV SDA,C ;數據送數據口
SETB SCL ;時鍾->高
LCALL I2C_DELAY ;延時
CLR SCL ;時鍾->低
LCALL I2C_DELAY ;延時
DJNZ R7,TXNEXT ;送下一位
RET
;----------------------------
;接收一位元組數據
;----------------------------
I2C_RXBYTE:
MOV R7,#8 ;8位計數
RXNEXT:
SETB SCL ;時鍾->高
LCALL I2C_DELAY ;延時
MOV C,SDA
RLC A
CLR SCL ;時鍾->低
LCALL I2C_DELAY ;延時
DJNZ R7,RXNEXT ;收下一位
RET
;----------------------------
I2C_DELAY: ;
NOP
NOP
RET ;
;----------------------------
I2C_DLYMS:
PUSH 0
PUSH 1
MOV R1,#2
I2CDL:
MOV R0,#248
DJNZ R0,$
DJNZ R1,I2CDL
POP 1
POP 0
RET
;----------------------------
MAIN:
MOV SP,#60H
MOV A,#0AAH
MOV BYTE_ADDR,#0
LCALL I2CWRITE
LCALL I2CREAD
MOV P1,A
SJMP $
END
;----------------------------