;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; File Name: i2c_low.asm
; Author: Alan G. Smith
; Purpose: This code is borrowed from MICroChip with all of the fancy
; stuff taken out.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
InitI2CBusMaster
;************************************************************
TxmtStartBit
bsf Bus_Busy ; on a start condition bus is busy
bsf STATUS, RP0 ; Select page 1
bsf _SDA ; set SDA high
bsf _SCL ; cLOCk is high
call Delay40uSec ; This is necessary for setup time
bcf _SDA ; This gives a falling edge on SDA while clock is high
call Delay47uSec ; Necessary for START HOLD time
return
;************************************************************
TxmtStopBit
bsf STATUS, RP0 ; Select page 1
bcf _SCL ; clock is low
bcf _SDA ; set SDA low
bsf _SCL ; clock is pulLED up
call Delay40uSec ; Setup time for STOP condition
bsf _SDA ; rising edge on SDA while CLOCK is high
call Delay47uSec ; makes sure a START isn‘t sent immediately after a STOP
bcf Bus_Busy ; The bus isn‘t busy anymore
return
;************************************************************
AbortI2C
call TxmtStopBit ; Send a stop bit
bsf Abort ; set the abort bit
return
;************************************************************
TxmtSlaveAddr
movf SlaveAddr, w ; Move slave address to W
bcf ACK_Error ; reset Acknowledge error bit
movwf I2CData ; move W to I2C Data
bcf I2CData, LSB ; Set for write
btfsc Slave_RW ; If skip then write operation
bsf I2CData, LSB ; Clear for read
call SendData ; send the address
btfss Txmt_SuCCess ; skip if successful
goto AddrSendFail ; Oops, we failed
retlw TRUE ; return true
AddrSendFail
btfss ACK_Error ; was there an error acknowledging
retlw FALSE ; No, so return 0
call TxmtStopBit ; Address not acknowleged, so send STOP bit
retlw FALSE ; Unsuccessful, so return 0
;************************************************************
SendData
; We might should make a copy of the data here, the example does but I don‘t see why!!!
bsf Txmt_Progress ; We are in the middle of transmitting
bcf Txmt_Success ; reset success bit
movlw 0x08
movwf I2CBitCount ; Set I2C Bit Count to 8
bsf STATUS, RP0 ; Select page 1
TxmtNextBit:
bcf _SCL ; Set clock Low
rlf I2CData, F ; MSB First, Note that I2CData is Destroyed
bcf _SDA ; Set clock based on what the MSB is
btfsc STATUS,C ; Was the MSB a 1
bsf _SDA ; Nope set it high
call Delay47uSec ; guarantee min LOW TIME tLOW & Setup time
bsf _SCL ; set clock high
call Delay40uSec ; guarantee min HIGH TIME tHIGH
decfsz I2CBitCount, F ; are we done yet
goto TxmtNextBit ; nope, send the next bit
;
; Check For Acknowledge
;
bcf _SCL ; reset clock
bsf _SDA ; Release SDA line for Slave to pull down
call Delay47uSec ; guarantee min LOW TIME tLOW & Setup time
bsf _SCL ; clock for slave to ACK
call Delay40uSec ; guarantee min HIGH TIME tHIGH
bcf STATUS, RP0 ; Select PAGE 0 to test SDA PIN
btfsc SdaPin ; SDA should be pulled low by slave if OK
goto TxmtErrorAck ; Uh oh, slave isn‘t behaving (or isn‘t there)
bsf STATUS, RP0 ; Select PAGE 1
bcf _SCL ; reset clock
bcf Txmt_Progress ; reset progress bit in Bus Status
bsf Txmt_Success ; Transmission successful
bcf ACK_Error ; ACK OK
return
TxmtErrorAck
bsf STATUS,RP0 ; select page 1
bsf _SDA ; tristate SDA
bsf _SCL ; tristate SCL
bcf Txmt_Progress ; reset progress bit in Bus Status
bcf Txmt_Success ; Transmission NOT successful
bsf ACK_Error ; No ACK From Slave
return
;************************************************************
GetData
bsf Rcv_Progress ; set Bus status for txmt progress
bcf Rcv_Success ; reset status bit
movlw 0x08
movwf I2CBitCount
RcvNextBit
bsf STATUS, RP0 ; page 1 for TRIS manipulation
bcf _SCL ; lower clock
bcf _SDA ; lower data line
call Delay47uSec ; guarantee min LOW TIME tLOW & setup time
bsf _SCL ; clock high, data sent by slave
call Delay40uSec ; guarantee min HIGH TIME tHIGH
bcf STATUS, RP0 ; select page 0 to read Ports
bcf STATUS, C ; 0 out Status
btfsc SdaPin ; Check state of pin
bsf STATUS, C ; Pin was high, set status
rlf I2CData, F ; left Shift data (MSB first)
decfsz I2CBitCount, F ; Are we done yet
goto RcvNextBit ; Nope, go get the next one
;
; Generate ACK bit if not last byte to be read,
; if last byte Gennerate NACK ; do not send ACK on last byte, main routine will send a STOP bit
;
bsf STATUS, RP0 ; Page 1 for TRIS manipulation
bcf _SCL ; pull SCL low
bcf _SDA ; ACK by pulling SDA low
btfsc Last_Byte_Rcv ; Is it the last byte to receive
bsf _SDA ; If so, send NACK by setting SDA high
call Delay47uSec ; guarantee min LOW TIME tLOW & Setup time
bsf _SCL ; Raise Clock back up
call Delay40uSec ; guarantee min HIGH TIME tHIGH
RcvEnd:
bcf _SCL ; reset clock
bcf Rcv_Progress ; reset bit in Bus Status
bsf Rcv_Success ; transmission successful
bcf ACK_Error ; ACK OK
return
Delay47uSec:
movlw ((_47uS_Delay-5)/3 + 1) ; move delay into W
DlyK
movwf DelayCount ; move what is in W to DelayCount
decfsz DelayCount, F ; Decrement DelayCount
goto $-1 ; Loop until 0
return ; return
Delay40uSec:
movlw ((_40uS_Delay-8)/3 + 1) ; move delay into W
goto DlyK ; goto DlyK loop
以下為測(cè)試程序(pIC16f84)
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Copyright (C) 1997 by Innovatus
; All Rights Reserved.
; This code may be distributed and used freely provided that this
; copyright notice stays intact and that any modifications are noted.
; For more information about Innovatus: http://www.innovatu.com
s;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; File Name: testI2C.asm
; Author: Alan G. Smith
; Purpose: This is testing out the I2C code.
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LIST P=16f84, F=INHX8M, C=100, N=59
#include "p16f84.inc"
XTAL_FREQ equ 10000000 ; the crystal Frequency we are using
ClkOut equ XTAL_FREQ / 4 ; the number of cycles per second
_40uS_Delay set (ClkOut/250000)
_47uS_Delay set (ClkOut/212766)
_50uS_Delay set (ClkOut/200000)
#define SclPIN PORTA, 0 ; Pin for SCL (I2C)
#define SdaPin PORTA, 1 ; Pin for SDA (I2C)
#define _SCL TRISA, 0 ; How do we toggle SCL
#define _SDA TRISA, 1 ; How do we toggle SDA
#define MSB 7
#define LSB 0
#define TRUE 1
#define FALSE 0
InitTrisA equ 0x07 ; The Initial state to TRIS port A.
#define Bus_Busy BusStatus,0
#define Abort BusStatus,1
#define Txmt_Progress BusStatus,2
#define Rcv_Progress BusStatus,3
#define Txmt_SuCCess BusStatus,4
#define Rcv_Success BusStatus,5
#define Fatal_Error BusStatus,6
#define ACK_Error BusStatus,7
#define Slave_RW BusControl,0
#define Last_Byte_Rcv BusControl,1
#define SlaveActive BusControl,2
CBLOCK 0x0C ; I2C Ram needed
BusStatus ; The I2C Status register
BusControl ; The I2C Control register
I2CBitCount ; Number of bits left to send (or receive)
I2CData ; Data (note: This is DESTROYED when sending)
SlaveAddr ; Slave Address
ENDC
CBLOCK
DelayCount ; used to figure out precise time delays
ENDC
org 0 ; Reset Vector
goto start ; Goto Start
start
bcf INTCON, GIE ; Turn off interrupts in this critical part of code!
bcf STATUS, RP0 ; Select Page 0 of registers
movlw 0x0C ; Make sure there are 0‘s on SCL and SDA
movwf PORTA ; We write 1‘s to TX since 0 is a start bit
bsf STATUS, RP0 ; Select Page 1 of registers
movlw InitTrisA ; Load W with the value for TRIS A
movwf TRISA ; movw the value from W into TRIS A
;*************** DEBUG CODE (let us use LEDs) *******************
clrf TRISB
;****************************************************************
clrf BusStatus ; Let‘s clear out busStatus before we start
clrf BusControl ; Let‘s clear out busControl before we start
;*************** TEST CODE *******************
clrf PORTB
main
movlw 0xB0 ; address of EEPROM
movwf SlaveAddr ; move into SlaveAddress register
call IsSlaveActive ; Check and see if the slave is active
movlw 0xFF ; move FF into w (turn all LED‘s on)
btfss SlaveActive ; If the slave is active, leave it
movlw 0xAA ; We didn‘t find it, turn off half.
bcf STATUS, RP0 ; Select page 0 of registers
movwf PORTB ; move W to PortB
done ; Game over man!
goto done ; endless loop
IsSlaveActive
bcf Slave_RW ; set for write operation
call TxmtStartBit ; Transmit Start Bit
call TxmtSlaveAddr ; Transmit Slave Address
bcf SlaveActive ; Assume not present
btfss ACK_Error ; skip if NACK, device is not present or not responding
bsf SlaveActive ; ACK received, device present & listening
call TxmtStopBit
return
#include "i2c_low.asm"
上一篇:基于PIC16F73單片機(jī)和ADS8341的SPI通信軟硬件實(shí)現(xiàn)方法
下一篇:一種0-24小時(shí)的時(shí)鐘源程序
推薦閱讀
史海拾趣
隨著技術(shù)的不斷發(fā)展和市場(chǎng)競(jìng)爭(zhēng)的加劇,Embedded Artists公司也面臨著前所未有的挑戰(zhàn)。為了保持競(jìng)爭(zhēng)優(yōu)勢(shì)并實(shí)現(xiàn)可持續(xù)發(fā)展,公司決定進(jìn)行轉(zhuǎn)型升級(jí)。他們加大了對(duì)人工智能、物聯(lián)網(wǎng)等前沿技術(shù)的研發(fā)投入,并積極探索新的商業(yè)模式和市場(chǎng)機(jī)會(huì)。同時(shí),公司還注重人才培養(yǎng)和團(tuán)隊(duì)建設(shè),為公司的未來(lái)發(fā)展儲(chǔ)備了充足的人才資源。
這些故事是基于Embedded Artists公司的背景和電子行業(yè)的一般趨勢(shì)而虛構(gòu)的。在實(shí)際的發(fā)展過(guò)程中,公司可能會(huì)面臨不同的挑戰(zhàn)和機(jī)遇,但無(wú)論如何,持續(xù)創(chuàng)新、追求卓越和關(guān)注社會(huì)責(zé)任將是推動(dòng)公司不斷前行的關(guān)鍵因素。
2012年,對(duì)于Cableform Inc來(lái)說(shuō)是一個(gè)重要的轉(zhuǎn)折點(diǎn)。這一年,公司成功加入了HUBBELL系列,與Hubbell工業(yè)控制有限公司建立了戰(zhàn)略合作關(guān)系。這一合作使得Cableform Inc能夠借助Hubbell的品牌影響力和市場(chǎng)渠道,進(jìn)一步拓展業(yè)務(wù)范圍,提升市場(chǎng)地位。同時(shí),通過(guò)與Hubbell的技術(shù)交流和資源共享,Cableform Inc在技術(shù)創(chuàng)新和產(chǎn)品升級(jí)方面也取得了顯著進(jìn)展。
為了進(jìn)一步擴(kuò)大市場(chǎng)份額和提升品牌影響力,BVLED公司開始積極拓展國(guó)內(nèi)外市場(chǎng)。在國(guó)內(nèi),公司加強(qiáng)了與大型照明企業(yè)的合作,通過(guò)聯(lián)合推廣和定制服務(wù)等方式提高了產(chǎn)品知名度。在國(guó)外,公司積極參加國(guó)際展覽和貿(mào)易洽談會(huì),與國(guó)際知名企業(yè)建立了合作關(guān)系,成功打開了國(guó)際市場(chǎng)的大門。
隨著公司規(guī)模的擴(kuò)大,C&K開始在全球范圍內(nèi)進(jìn)行布局。它在中國(guó)、法國(guó)、越南、德國(guó)和印度等地設(shè)立了生產(chǎn)基地,這些工廠不僅提高了生產(chǎn)效率,還使得C&K能夠更好地服務(wù)全球客戶。同時(shí),C&K的產(chǎn)品線也不斷擴(kuò)展,覆蓋了消費(fèi)類、工業(yè)類和汽車類等多個(gè)領(lǐng)域。此外,C&K還支持定制化開發(fā),能夠滿足不同客戶的特殊需求。這種全球布局和業(yè)務(wù)拓展使得C&K在電子行業(yè)中獲得了廣泛的認(rèn)可和好評(píng)。
在1950年代,電子工業(yè)正處于蓬勃發(fā)展的初期。阿爾·克瑞頓,一位富有創(chuàng)新精神的化學(xué)家,在美國(guó)馬薩諸塞州丹佛斯市的一個(gè)實(shí)驗(yàn)室里,經(jīng)過(guò)無(wú)數(shù)次的試驗(yàn),終于研發(fā)出了一種名為Devcon可塑鋼修補(bǔ)劑的新型材料。這種材料經(jīng)濟(jì)實(shí)惠、不易燃,且能夠作為焊接的替代品,迅速在電子制造和維修領(lǐng)域引起了廣泛關(guān)注。這就是DEVCON公司的起點(diǎn),一個(gè)由創(chuàng)新精神和市場(chǎng)需求共同點(diǎn)燃的火花。
在1950年代,電子工業(yè)正處于蓬勃發(fā)展的初期。阿爾·克瑞頓,一位富有創(chuàng)新精神的化學(xué)家,在美國(guó)馬薩諸塞州丹佛斯市的一個(gè)實(shí)驗(yàn)室里,經(jīng)過(guò)無(wú)數(shù)次的試驗(yàn),終于研發(fā)出了一種名為Devcon可塑鋼修補(bǔ)劑的新型材料。這種材料經(jīng)濟(jì)實(shí)惠、不易燃,且能夠作為焊接的替代品,迅速在電子制造和維修領(lǐng)域引起了廣泛關(guān)注。這就是DEVCON公司的起點(diǎn),一個(gè)由創(chuàng)新精神和市場(chǎng)需求共同點(diǎn)燃的火花。
最近編labview程序遇到一個(gè)錯(cuò)誤,在此于大家分享一下。 NI-DAQmx運(yùn)行出錯(cuò),代碼為50103,錯(cuò)誤原因是指定的資源被預(yù)留了 主要軟件: Driver Software>>NI-DAQmx 主要軟件版本: 7.0 主要軟件修正版本: 次要軟件: N/A 問(wèn)題: 為什么在運(yùn)行過(guò) ...… 查看全部問(wèn)答∨ |
想用SetSystemPowerState(NULL,POWER_STATE_IDLE,POWER_FORCE)讓電話接通3秒后鎖屏,不過(guò)發(fā)現(xiàn)鎖屏后不能讓屏幕亮起來(lái)而且電話仍不掛斷就不行了,這時(shí)候再按鍵盤一點(diǎn)用都沒(méi)有,當(dāng)然除非按掛機(jī)鍵…… 問(wèn)問(wèn)大俠們?cè)趺唇鉀Q這個(gè)問(wèn)題。就是如何在鎖屏后 ...… 查看全部問(wèn)答∨ |
帶異步預(yù)置功能的D發(fā)器的verilog描述,求助 這種D觸發(fā)器應(yīng)該是很常見(jiàn),功能也很簡(jiǎn)單的一種單元,但最近用verilog描述的時(shí)候卻遇到了不少麻煩。 因?yàn)槲覍?duì)VHDL比較熟悉,所以用VHDL描述起來(lái)很簡(jiǎn)單,但我應(yīng)用的地方必須用verilog寫,對(duì)它又不太熟,所以請(qǐng)大家?guī)蛡€(gè)忙。 vhdl代碼如下: librar ...… 查看全部問(wèn)答∨ |
本人因?yàn)橹匮b系統(tǒng)失誤,重新啟動(dòng)的時(shí)候直接進(jìn)入CMOS,不能從硬盤或光盤啟動(dòng),現(xiàn)在該怎么辦?請(qǐng)各位老大救救我啊。。。 我已經(jīng)嘗試過(guò) Advanced BIOS Features / First Boot Device 設(shè)置了。。。… 查看全部問(wèn)答∨ |
建議ST將各個(gè)中斷向量的中斷源寫清楚:例如: TIM1有好多個(gè)中斷源,但分配的中斷向量確只有4個(gè)! 但沒(méi)有任何一份文檔里列出這些中斷是如何分配到4個(gè)中斷向量的.也許有人會(huì)說(shuō),中斷向里不是寫明白了那個(gè)中斷向量是分配到何種性的么. ...… 查看全部問(wèn)答∨ |
瑞薩杯--2011全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽新聞發(fā)布會(huì) 昨天下午(6月7日)“瑞薩杯2011全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽”新聞發(fā)布會(huì)在競(jìng)賽秘書處單位北京理工大學(xué)舉行,從而拉開了本屆大賽的序幕。教育部高等教育司、工業(yè)和信息化部電子信息司相關(guān)領(lǐng)導(dǎo),全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽組委會(huì)主任、兩院院 ...… 查看全部問(wèn)答∨ |
本帖來(lái)自中國(guó)電子開發(fā)網(wǎng),為大家共享! 打開IAR官方網(wǎng)站www.iar.com,點(diǎn)擊“Dowmloads”,找到STM8的30天試用版的鏈接并點(diǎn)擊,然后會(huì)出來(lái)一個(gè)注冊(cè)的界面, 注冊(cè)其實(shí)很簡(jiǎn)單,只要郵箱你填個(gè)正確的就行了,其他的隨便填,選擇的項(xiàng)也是 ...… 查看全部問(wèn)答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 【下載】LAT1466 USB x Device HID Standalone的移植
- 【下載】LAT1488 STM32 USBxDevice MSC standalone移植示例
- 【下載】LAT1482 STM32G0單線串口通信幀錯(cuò)誤問(wèn)題解析
- 【下載】LAT1473 STM32C0 HAL庫(kù)的SPI 驅(qū)動(dòng)導(dǎo)致的Hardfault問(wèn)題分析
- 【下載】LAT1490 兩個(gè)STM32G0 I2C 通信異常的案例分析
- 【下載】LAT1470 SPI傳輸長(zhǎng)度超過(guò)1024時(shí)出現(xiàn)異常的問(wèn)題分析
- 英飛凌穩(wěn)居微控制器領(lǐng)域榜首,鞏固其在全球車用半導(dǎo)體市場(chǎng)的領(lǐng)導(dǎo)地位
- 迅為imx6ull開發(fā)板使用c語(yǔ)言調(diào)用shell命令控制led燈
- 迅為IMX8MM開發(fā)板Android編譯環(huán)境搭建
- 迅為IMX6ULL開發(fā)板NFS服務(wù)器的使用
- 迅為ITOP4412開發(fā)板Qt界面添加圖片
- 迅為IMX6開發(fā)板OTA遠(yuǎn)程升級(jí)-SWUpdata概述和使用
- 迅為IMX6ULL開發(fā)板NFS服務(wù)器的搭建
- 迅為IMX6開發(fā)板Buildroot文件系統(tǒng)4G撥號(hào)上網(wǎng)工具測(cè)試
- 實(shí)驗(yàn)分享丨迅為IMX6ULL開發(fā)板點(diǎn)亮第一個(gè)led燈
- TDK推出第一款嵌入式柵極驅(qū)動(dòng)器- 加強(qiáng)EV熱系統(tǒng)效率
- LAB后輪轉(zhuǎn)向排行榜:從高端到普及,后輪轉(zhuǎn)向也要白菜化了
- 子彈都不怕的動(dòng)力電池,為何碰撞還起火?
- 從18650到21700再到大圓柱電池 新電池帶來(lái)什么好處?
- 國(guó)外機(jī)器人選手Apptronik:無(wú)縫接入“人類工人崗位”
- 孚能科技/清陶能源等企業(yè)固態(tài)電池專利“曝光”!
- 固態(tài)電池目前的消費(fèi)者是股民,你要的量產(chǎn)車還早
- 重磅!全固態(tài)電池國(guó)家戰(zhàn)略全面啟動(dòng)
- 方案解讀 | X9SP 單芯片艙泊一體
- 用于車身控制模塊中 22 路多開關(guān)檢測(cè)接口(MSDI)芯片 SGMCD1020Q
- 是德科技直播 | 小探頭,大學(xué)問(wèn),別讓探頭拖累你的測(cè)試結(jié)果!
- 是德科技感恩月直播已結(jié)束|高速示波器基礎(chǔ)與是德新品示波器解析
- 有獎(jiǎng)直播 | 是德科技信號(hào)完整性測(cè)試的演變和更新
- 暑期加油站:零起點(diǎn)帶你學(xué)遍單片機(jī)
- 開發(fā)板芯幣競(jìng)拍,每日一款!今日競(jìng)拍開發(fā)板:Banana PI D1
- 駿龍科技&ADI有獎(jiǎng)直播:適用于視頻、轉(zhuǎn)換器、通信的千兆數(shù)字隔離器
- 現(xiàn)場(chǎng)抽取PS5等諸多好禮 SiFive RISC-V 中國(guó)技術(shù)論壇 上海、北京、深圳 3場(chǎng)線下活動(dòng)邀您出席!
- 【團(tuán)購(gòu)】EE_FPGA V2.0配套器件
- 有獎(jiǎng)直播 | keysight 如何避免損害示波器
- 中國(guó)OLED產(chǎn)業(yè)市場(chǎng)前景分析 未來(lái)市場(chǎng)將近600億美元
- 深圳機(jī)器人企業(yè)年產(chǎn)值達(dá)1035億元
- 泰克為不同行業(yè)提供100種應(yīng)用功能免費(fèi)試用
- 讓區(qū)塊鏈落地開花 在云端之上起舞
- 京東宣布進(jìn)軍無(wú)人機(jī)植保,打造智慧農(nóng)業(yè)共同體
- 谷歌和高通宣布或?yàn)锳ndroid手機(jī)提供4年軟件更新支持
- 華為nova8真機(jī)曝光:搭麒麟985 +66W快充
- 蘋果中國(guó)上架iPhone 12皮革保護(hù)套:用久褪色、有印痕
- vivo X60新消息:首發(fā)三星Exynos 1080芯片
- 摩托羅拉razr 5G 天選金開啟預(yù)約:為中國(guó)特供配色
- DSP硬件復(fù)位信號(hào)大家用哪種方法
- AVR單片機(jī)程序框架(最簡(jiǎn)操作系統(tǒng))
- 轉(zhuǎn)發(fā)一則很好的電子技術(shù)經(jīng)驗(yàn),大家收藏哦
- 芯片級(jí)封裝新技術(shù)興起 加速LED行業(yè)整合步伐
- 一組直流5V的電源,如何轉(zhuǎn)換成±12V
- 新一代網(wǎng)絡(luò)紅人玩環(huán)保,林家小妹刺激你的眼球!
- nboot里面串口輸出死活都有問(wèn)題,大家熟悉的朋友指導(dǎo)下啊
- pb5.0的browse info問(wèn)題
- 本人不太擅長(zhǎng)編程還請(qǐng)大神們幫幫忙
- 今天上午10:00 直播:ADI 儲(chǔ)能系統(tǒng)助力電動(dòng)汽車快充站的建設(shè)