在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

應廣單片機系列——用I2C接口讀寫EEPROM

聚豐開發(fā) ? 2018-10-17 15:43 ? 次閱讀

注:本文是作者以前發(fā)表在其個人博客,現在發(fā)布到電子發(fā)燒友專欄


本例是用針對標準I2C接口EEPROM存儲器24C02進行讀寫操作,只要對例程做適當修改,就可以用到大部分控制I2C接口設備的場合。

應廣單片機軟件I2C接口例程(MASTER模式)

本例僅供參考,歡迎指正程序中的問題

//-----------------------------------------
.chip p201cs14a
//{{PADAUK_CODE_OPTION
.Code_OptionBootupSlow// 1024 ILRC
.Code_OptionLVD2.79V// Maximum performance = 4 MIPS
.Code_OptionSecurityEnable// Security 3/4 words Enable
//}}PADAUK_CODE_OPTION


//定義I2C接口
I2C_SDAequpa.7
I2C_SCLequpa.6
I2C_SDA_DIRequpac.7
I2C_SCL_DIRequpac.6
I2C_LONG_DLYequ50
I2C_SHORT_DLYequ20
I2C_SDA_HIGHequset1I2C_SDA
I2C_SDA_LOWequset0I2C_SDA
I2C_SCL_HIGHequset1I2C_SCL
I2C_SCL_LOWequset0I2C_SCL
I2C_SDA_OUTPUTequset1I2C_SDA_DIR
I2C_SDA_INPUTequset0I2C_SDA_DIR
I2C_SCL_OUTPUTequset1I2C_SCL_DIR
I2C_SCL_INPUTequset0I2C_SCL_DIR


//定義I2C變量
bytei2c_rw_addr//讀寫地址
bytei2c_rw_byte//讀寫數據
bytei2c_rw_cmd//讀寫的器件地址
bytei2c_rw_temp//讀寫過程中間變量
bytei2c_rw_cnt//讀寫過程中間變量

//
byteXms
bytems_cnt

//
bytetest_addr
bytetest_data

.romadr0x000
gotomain0
gotomain1

.romadr0x010
isr_entry:
pushaf
intrq = 0
popaf
reti


//----------------------------
//產生START信號
//----------------------------
i2c_start:
I2C_SDA_OUTPUT
I2C_SCL_OUTPUT
I2C_SDA_HIGH
delayI2C_LONG_DLY
I2C_SCL_HIGH
delayI2C_LONG_DLY
I2C_SDA_LOW
delayI2C_LONG_DLY
I2C_SCL_LOW
delayI2C_LONG_DLY
ret

//----------------------------
//產生STOP信號
//----------------------------
i2c_stop:
I2C_SCL_LOW
delayI2C_LONG_DLY
I2C_SDA_LOW
delayI2C_LONG_DLY
I2C_SCL_HIGH
delayI2C_LONG_DLY
I2C_SDA_HIGH
delayI2C_LONG_DLY
//
I2C_SCL_INPUT
I2C_SDA_INPUT
ret


//----------------------------
//檢查SALVE ACK信號
//----------------------------
i2c_slave_ack:
//don't check ACK
I2C_SDA_INPUT
delayI2C_SHORT_DLY
I2C_SCL_HIGH
delayI2C_SHORT_DLY
I2C_SCL_LOW
delayI2C_SHORT_DLY
I2C_SDA_OUTPUT
I2C_SDA_LOW
delayI2C_SHORT_DLY
ret

//----------------------------
//輸出MASTER ACK信號
//----------------------------
i2c_master_ack:
I2C_SDA_OUTPUT
I2C_SDA_LOW
delayI2C_SHORT_DLY
I2C_SCL_HIGH
delayI2C_SHORT_DLY
I2C_SCL_LOW
delayI2C_SHORT_DLY
ret

//----------------------------
//輸出MASTER NACK信號
//----------------------------
i2c_master_nack:
I2C_SDA_OUTPUT
I2C_SDA_HIGH
delayI2C_SHORT_DLY
I2C_SCL_HIGH
delayI2C_SHORT_DLY
I2C_SCL_LOW
delayI2C_SHORT_DLY
ret


//------------------------------
//寫一個字節(jié)
//Input: i2c_rw_temp
//Used: i2c_rw_cnt
//------------------------------
i2c_write_8bit:
i2c_rw_cnt = 8
i2c_write_8bit_loop:
slci2c_rw_temp
swapcI2C_SDA
delayI2C_SHORT_DLY
I2C_SCL_HIGH
delayI2C_SHORT_DLY
I2C_SCL_LOW
delayI2C_SHORT_DLY
dzsni2c_rw_cnt
gotoi2c_write_8bit_loop
ret

//------------------------------
//讀一個字節(jié)
//Used: i2c_rw_cnt
//Output: i2c_rw_temp
//------------------------------
i2c_read_8bit:
i2c_rw_temp = 0
i2c_rw_cnt = 8
delayI2C_SHORT_DLY
i2c_read_8bit_loop:
I2C_SCL_HIGH
delayI2C_SHORT_DLY
swapcI2C_SDA
slci2c_rw_temp
I2C_SCL_LOW
delayI2C_SHORT_DLY
dzsni2c_rw_cnt
gotoi2c_read_8bit_loop
ret

//------------------------------
//Input: i2c_rw_addr
// i2c_rw_cmd
//Used: i2c_rw_cnt
// i2c_rw_temp
//Output: i2c_rw_byte
//------------------------------
i2c_read_byte:
//start
calli2c_start

//write device address(write)
i2c_rw_temp = i2c_rw_cmd
calli2c_write_8bit

//slave ack
calli2c_slave_ack

//write register address
i2c_rw_temp = i2c_rw_addr
calli2c_write_8bit

//slave ack
//don't check ACK
calli2c_slave_ack

//start repeat
calli2c_start

//write device address(read)
i2c_rw_temp = i2c_rw_cmd
i2c_rw_temp.0 = 1
calli2c_write_8bit

//slave ack
//don't check ACK
I2C_SDA_INPUT
delayI2C_SHORT_DLY
I2C_SCL_HIGH
delayI2C_SHORT_DLY
I2C_SCL_LOW
delayI2C_SHORT_DLY//這里為特殊情況I2C_SDA不用轉為輸出

//read data
i2c_rw_temp = 0
calli2c_read_8bit
i2c_rw_byte = i2c_rw_temp//store data

//master nack
calli2c_master_nack

//stop
calli2c_stop

//retune
delayI2C_LONG_DLY
wdreset
ret

//------------------------------
//Input: i2c_rw_addr
// i2c_rw_byte
// i2c_rw_cmd
//Used: i2c_rw_cnt
// i2c_rw_temp
//------------------------------
i2c_write_byte:
//start
calli2c_start

//write device address
i2c_rw_temp = i2c_rw_cmd
calli2c_write_8bit

//slave ack
//don't check ACK
calli2c_slave_ack

//write register address
i2c_rw_temp = i2c_rw_addr
calli2c_write_8bit

//slave ack
//don't check ACK
calli2c_slave_ack

//write data
i2c_rw_temp = i2c_rw_byte
calli2c_write_8bit

//slave ack
//don't check ACK
calli2c_slave_ack

//stop
calli2c_stop

//retune
delayI2C_LONG_DLY
wdreset
ret

EEPROM_RW_CMDequ0xA0
//------------------------------
//函數名: eeprom_read_byte
//Input: i2c_rw_addr
//Used: i2c_rw_cnt
// i2c_rw_temp
//Output: i2c_rw_byte
//------------------------------
eeprom_read_byte:
i2c_rw_cmd = EEPROM_RW_CMD
gotoi2c_read_byte//注意這里用的是跳轉
//------------------------------
//函數名: eeprom_write_byte
//Input: i2c_rw_addr
// i2c_rw_byte
//Used: i2c_rw_cnt
// i2c_rw_temp
//注意: 調用完后需要等待一段時間以保證寫操作完成
//------------------------------
eeprom_write_byte:
i2c_rw_cmd = EEPROM_RW_CMD
gotoi2c_write_byte//注意這里用的是跳轉

//----------------------------------------
//input: ms
//該函數以4M頻率為基準時鐘實現延時
//----------------------------------------
delayXms:
while(Xms)
{
wdreset
ms_cnt = 20
while(ms_cnt)
{
delay195
ms_cnt--
}
Xms--
}
ret

main0:
.ADJUST_OTP_IHRCR8MIPS// IHRC/2 = 8MIPS, WatchDog Disable, RAM 0,1 temporary be used
sp = 0x30

disgint
inten = 0


pa = 0b0000_0000
paph = 0b1101_0000
pac = 0b0000_0001
pb = 0b0000_0000
pbph = 0b0000_0000
pbc = 0b1111_1111

I2C_SDA_INPUT
I2C_SCL_INPUT

delay200

mova,0b100_11_111
movt16m,a

clkmd.1 = 1//enable watch dog
wdreset


Xms = 100
calldelayXms

test_data = 0
test_addr = 0

main0_loop:
wdreset

//寫E2EPROM
i2c_rw_addr = test_addr
i2c_rw_byte = test_data
calleeprom_write_byte

//調用EEPROM寫操作函數后要等待一段時間,以保證數據寫操作完成
Xms = 20
calldelayXms

//讀E2EPROM
i2c_rw_addr = test_addr
calleeprom_read_byte
if(i2c_rw_byte != test_data)
{
//讀回的數據比較出錯,判斷為讀寫E2PROM出錯
nop
}

test_addr ++
test_data --

gotomain0_loop

//----------------FPPA1-------------------
main1:
sp = 52
main1_loop:
gotomain1_loop

本例代碼是從實際程序中移植而來,已編譯,未做最終調試


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 單機片
    +關注

    關注

    0

    文章

    51

    瀏覽量

    11814
收藏 人收藏

    評論

    相關推薦

    I2C總線與Arduino的接口示例

    在現代電子設計中,I2C總線因其簡單性和靈活性而受歡迎。它允許多個設備共享同一通信線路,從而節(jié)省空間和成本。Arduino,作為一個多功能的微控制器平臺,自然也支持I2C通信。 I2C
    的頭像 發(fā)表于 01-17 15:34 ?318次閱讀

    I2C總線與單片機的連接

    在現代電子系統(tǒng)中,單片機(MCU)是核心控制單元,而I2C總線作為一種多主機、多從的串行通信協議,因其簡單、高效和節(jié)省引腳的特性而被廣泛應用于各種電子設備中。 I2C總線概述
    的頭像 發(fā)表于 01-17 15:18 ?239次閱讀

    I2C總線應用實例分析

    。I2C總線使用兩條線進行通信:數據線(SDA)和時鐘線(SCL)。這種雙線制設計使得I2C總線能夠在多個設備之間共享,而不需要為每個設備單獨布線。 應用實例:溫濕度傳感器 假設我們正在設計一個智能家居系統(tǒng),需要實時監(jiān)測室內的溫濕度。我們選擇使用一個帶有
    的頭像 發(fā)表于 01-17 15:09 ?223次閱讀

    AN-840: 通過I2C接口更新代碼

    電子發(fā)燒友網站提供《AN-840: 通過I2C接口更新代碼.pdf》資料免費下載
    發(fā)表于 01-15 16:04 ?0次下載
    AN-840: 通過<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>更新代碼

    UC-001:MicroConverter I2C兼容接口

    電子發(fā)燒友網站提供《UC-001:MicroConverter I2C兼容接口.pdf》資料免費下載
    發(fā)表于 01-15 15:51 ?0次下載
    UC-001:MicroConverter <b class='flag-5'>I2C</b>兼容<b class='flag-5'>接口</b>

    tvl320aic32完成通話的功能,單片機i2s接口發(fā)送的數據aic32接收不到怎么解決?

    我們正用tvl320aic32于我們的設備內完成通話的功能,stm32f103的單片機控制,現在已經可以i2c正確的寫入與讀取aic32的寄存器值,但是在使用
    發(fā)表于 11-06 08:16

    51單片機STC8H8K64U通過RA8889/RA8876如何控制彩屏 I2C源碼下載

    51單片機STC8H8K64U驅動彩屏,控制器采用瑞佑RA8889. 使用軟件模擬I2C方式通信,驅動大屏顯示。
    的頭像 發(fā)表于 11-01 11:02 ?579次閱讀
    51<b class='flag-5'>單片機</b>STC8H8K64U通過RA8889/RA8876如何控制彩屏 <b class='flag-5'>I2C</b>源碼下載

    使用C2000 I2C模塊連接EEPROM

    電子發(fā)燒友網站提供《使用C2000 I2C模塊連接EEPROM.pdf》資料免費下載
    發(fā)表于 08-27 09:53 ?0次下載
    使用<b class='flag-5'>C</b>2000 <b class='flag-5'>I2C</b>模塊連接<b class='flag-5'>EEPROM</b>

    CYUSB3014通過I2C EEPROM啟動時,收到了I2C EEPROM編程失敗的錯誤信息怎么解決?

    我使用的是 CYUSB3014。 在通過 I2C EEPROM 啟動時,我收到了 I2C EEPROM 編程失敗的錯誤信息 當我嘗試使用 RAM 時,編程成功。 PMODE 引腳連接至
    發(fā)表于 07-11 06:12

    如何通過cyusb3014的i2c操作界面操作ads1119的i2c接口?

    我使用 cyusb3014 作為 i2c 設備的主機,并使用 ads1119 采集電壓。 我需要使用 i2c 操作相關指令。 例子中提供的示例只顯示了讀寫步驟,即 dev_ Addr+reg_
    發(fā)表于 05-23 07:30

    利用軟件模擬i2c讀寫EEPROM,超過256個字節(jié)就讀寫不了了的原因?如何處理?

    利用野火的軟件模擬i2c讀寫EEPROM,EEPROM的芯片型號為AT24C512,讀寫256個
    發(fā)表于 03-20 06:42

    STM32F103利用軟件模擬I2C讀寫EEPROM,超過385個字節(jié)就讀寫不了的原因?

    在STM32F103的芯片中,利用軟件模擬I2C讀寫EEPROM,在使用頁寫入的方式進行讀寫時,能夠讀寫385個字節(jié),(
    發(fā)表于 03-19 07:45

    stm32f4軟件模擬I2C讀寫EEPROM無器件響應是什么原因造成的?

    利用STM32F4軟件模擬I2C讀寫EEPROM時,在檢測I2C總線設備時,在等待應答階段,CPU讀取SDA線口狀態(tài)值為1(GPIO_ReadInputDataBit(GPIOB,GP
    發(fā)表于 03-19 06:36

    i2c接口由哪幾根線組成 i2c接口可以接哪些器件

    I2C接口的線路可以適應不同的系統(tǒng)需求和器件規(guī)格,因此具體的線路配置可能會有所不同。但通常來說,時鐘線(SCL)和數據線(SDA)是I2C接口的核心線路。
    的頭像 發(fā)表于 03-05 16:55 ?4012次閱讀
    <b class='flag-5'>i2c</b><b class='flag-5'>接口</b>由哪幾根線組成 <b class='flag-5'>i2c</b><b class='flag-5'>接口</b>可以接哪些器件

    什么是I2C接口?什么是I3C接口?I2CI3C的區(qū)別

    I2C接口是一種串行通信協議,全稱為Inter-Integrated Circuit,即集成電路間總線。它是一種雙向、兩線制(SCL和SDA)的串行通信接口,主要用于連接微控制器和其他外圍設備,如傳感器、存儲器、顯示器等。
    的頭像 發(fā)表于 02-17 14:39 ?6878次閱讀
    什么是<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>?什么是<b class='flag-5'>I3C</b><b class='flag-5'>接口</b>?<b class='flag-5'>I2C</b>與<b class='flag-5'>I3C</b>的區(qū)別
    主站蜘蛛池模板: 亚洲天堂导航 | 色噜噜狠狠狠狠色综合久 | 免看乌克兰a一级 | 国产成人精品三级 | 在线天堂中文 | 国产精品久久久久久久牛牛 | 真实国产伦子系 | 亚洲综合五月天欧美 | 性 色 黄 一级 | 天天干在线免费视频 | 日本wwwxx| 亚洲综合久久久久久888 | 四虎成人免费影院网址 | 伊人电影综合网 | 性生活黄色毛片 | 手机看片1024免费视频 | 欧美性猛交xxxxbbbb | 加勒比一木道|视频在线看 加勒比在线免费视频 | 特黄特色大片免费播放路01 | 四虎最新永久免费网址 | 亚洲一区在线免费观看 | 操你啦在线播放 | 日韩成人免费观看 | 成人在线天堂 | 夜夜夜夜夜夜夜工噜噜噜 | 婷婷中文字幕 | 国产精品视频你懂的 | 国产免费私拍一区二区三区 | 看黄网站在线 | 青青伊人91久久福利精品 | 日日摸人人看97人人澡 | 日本免费网站在线观看 | 国产xxxxxx久色视频在 | 女人被男人免费播放网站 | 天天插天天舔 | 精品毛片视频 | 午夜两性色视频免费网站 | 免费在线看视频 | 在线黄网 | 天堂中文字幕 | 黄色成人免费网站 |