共2条
1/1 1 跳转至页
帮我看看我这程序,急急急!!!!
问
大虾,你们帮帮我。我现在再用449做EEPRAM,用的是MICROCHIP的24LC01B。以前我做过AT45DB01,作出来了,可现在我用同样的方法却作不出来。我是按时序严格来得。下面是我测试一字节的程序,请大家帮我看看。我快风了,急急急!
;IIC器件的测试程序
;使用器件为24C01
;硬件连接为P4.6,P4.7
#include "MSP430x44x.h"
RXTXI2C equ 202h ;数据缓存寄存器
ADDRI2C1 equ 204h ;器件内部高地址
ADDRI2C0 equ 203h ;器件内部低地址
DATAI2C equ 206h ;要写入的数据
BITI2C equ 208h ;位计数寄存器
SDA equ 080h ;P4.7数据线
SCL equ 040h ;P4.6时钟线
Code equ 0A0h
RI2C equ 210H ;接收数据寄存器
ORG 08000h ;
RESET mov.w #600h,SP
Init_Sys mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
bis.b #SELM_A+FLL_DIV_8,&FLL_CTL1
MAIN
mov.b #07H, ADDRI2C1 ;要写入的器件内部地址
mov.b #00h, ADDRI2C0
mov.b #0ffH, DATAI2C ;要写入的具体数据
call #Write_I2C ;写入数据
mov.b #1fffh, r15
delay dec r15
jnz delay
mov.b #07h,ADDRI2C1
mov.b #00h,ADDRI2C0
CALL #Read_I2C ;读出刚写入的数据
mov.b DATAI2C,r9
JMP MAIN
I2CDLY NOP ;延时
NOP
NOP
NOP
RET
Read_I2C
mov.b #Code,RXTXI2C ; 在具体的IIC器件中读
; 某一个地址的数据
add.b #0,RXTXI2C
call #I2C_Start
call #I2C_TX
call #I2C_NOAckn
mov.b ADDRI2C0,RXTXI2C
call #I2C_TX
call #I2C_NOAckn
mov.b ADDRI2C1,RXTXI2C ;
call #I2C_TX
call #I2C_NOAckn
mov.b #Code,RXTXI2C
add.b #1,RXTXI2C
call #I2C_Start ;
call #I2C_TX
call #I2C_NOAckn
call #I2C_Read ;
call #I2C_NOAckn
call #I2C_Stop
ret
;-------------------------------------------------------------------------------
I2C_Start bis.b #SCL+SDA,&P4DIR ; 启动总线
bic.b #SCL,&P4OUT
bis.b #SDA,&P4OUT
bis.b #SCL,&P4OUT
CALL #I2CDLY
bic.b #SDA,&P4OUT
CALL #I2CDLY
bic.b #SCL,&P4OUT
bis.b #SDA,&P4OUT
ret
;-------------------------------------------------------------------------------
I2C_TX bis.b #SDA+SCL,P4DIR
mov.b #08h,BITI2C ;向总线发送一个字节
I2C_CLK bic.b #SCL,&P4OUT ;SCL=0
call #I2CDLY
i2c_send rla.b RXTXI2C
jc i2c_send1i2c_send0 bic.b #SDA,&P4OUT
call #I2CDLY
jmp i2c_sx
i2c_send1 bis.b #SDA,&P4OUT
call #I2CDLY
i2c_sx
bis.b #SCL,&P4OUT ;SCL=1
call #I2CDLY
dec.b BITI2C
jnz I2C_CLK
bic.b #SCL,&P4OUT
ret
;-------------------------------------------------------------------------------
I2C_NOAckn bic.b #SDA,&P4DIR
bis.b #SCL,&P4OUT ; 不应答信号
CALL #I2CDLY
bic.b #SCL,&P4OUT
CALL #I2CDLY
ret
;-------------------------------------------------------------------------------
I2C_Ackn bis.b #SDA+SCL,&P4DIR;产生应答
biC.b #SDA,&P4OUT
bis.b #SCL,&P4OUT
call #I2CDLY
bic.b #SCL,P4OUT
nop
bic.b #SDA,&P4OUT
ret
;------------------------------------------------------------------------------- 读一字节
I2C_Read bis.b #SCL,&P4DIR
bic.b #SDA,&P4DIR
bic.b #SCL,&P4OUT
mov.b #08h,BITI2C
I2c_sck bis.b #SCL,&P4OUT
call #I2CDLY
bit.b #SDA, &P4IN
jnz bit1
bit0 bic.b #01h,RI2C
jmp bit_sx
bit1 bis.b #01h,RI2C
bit_sx bic.b #SCL,&P4OUT
call #I2CDLY
dec.b BITI2C
jnz move_bite
jmp ret_1
move_bite rla.b RI2C
jmp I2c_sck
ret_1 ret
;-------------------------------------------------------------------------------
I2C_Stop bis.b #SDA+SCL,&P4DIR
bic.b #SCL,&P4OUT ;停止总线
CALL #I2CDLY
bic.b #SDA,&P4OUT
CALL #I2CDLY
bis.b #SCL,&P4OUT
CALL #I2CDLY
call #I2CDLY
CALL #I2CDLY
bis.b #SDA,&P4OUT
CALL #I2CDLY
bic.b #SCL,&P4OUT
I2C_End ret
;-------------------------------------------------------------------------------
Write_I2C mov.b #Code,RXTXI2C ; 向某一个IIC器件的某
一地址写入具体的数据
add.b #0h,RXTXI2C
call #I2C_Start
call #I2C_TX
call #I2C_NOAckn
mov.b ADDRI2C0,RXTXI2C
call #I2C_TX
call #I2C_NOAckn
mov.b ADDRI2C1,RXTXI2C ; 低地址
call #I2C_TX
call #I2C_NOAckn
mov.b DATAI2C,RXTXI2C ; 数据
call #I2C_TX
call #I2C_NOAckn
call #I2C_Stop
ret
ORG 0FFFEh
DW RESET
END 答 1: 总线启动
I2C_Start bic.b #SCL+SDA,&P4DIR
bis.b #SDA,&P4DIR
bis.b #SCL,&P4DIR
ret
总线停止
I2C_Stop bis.b #SDA,&P4DIR
bic.b #SCL,&P4DIR
bic.b #SDA,&P4DIR
ret
向总线发送一字节数据
I2C_TX mov.b #08,BITI2C
I2C_Send rla.b RXTXI2C
jc I2C_Send1
I2C_Send0 bis.b #SDA,&P4DIR
jmp I2C_Sx
I2C_Send1 bic.b #SDA,&P4DIR
I2C_Sx bic.b #SCL,&P4DIR
CALL I2CDLY
bis.b #SCL,&P4DIR
dec.b BITI2C
jnz I2C_Send
bic.b #SDA,&P4DIR
I2C_Ackn bic.b #SCL,&P4DIR
CALL #I2CDLY
bis.b #SCL,&P4DIR
ret
;IIC器件的测试程序
;使用器件为24C01
;硬件连接为P4.6,P4.7
#include "MSP430x44x.h"
RXTXI2C equ 202h ;数据缓存寄存器
ADDRI2C1 equ 204h ;器件内部高地址
ADDRI2C0 equ 203h ;器件内部低地址
DATAI2C equ 206h ;要写入的数据
BITI2C equ 208h ;位计数寄存器
SDA equ 080h ;P4.7数据线
SCL equ 040h ;P4.6时钟线
Code equ 0A0h
RI2C equ 210H ;接收数据寄存器
ORG 08000h ;
RESET mov.w #600h,SP
Init_Sys mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
bis.b #SELM_A+FLL_DIV_8,&FLL_CTL1
MAIN
mov.b #07H, ADDRI2C1 ;要写入的器件内部地址
mov.b #00h, ADDRI2C0
mov.b #0ffH, DATAI2C ;要写入的具体数据
call #Write_I2C ;写入数据
mov.b #1fffh, r15
delay dec r15
jnz delay
mov.b #07h,ADDRI2C1
mov.b #00h,ADDRI2C0
CALL #Read_I2C ;读出刚写入的数据
mov.b DATAI2C,r9
JMP MAIN
I2CDLY NOP ;延时
NOP
NOP
NOP
RET
Read_I2C
mov.b #Code,RXTXI2C ; 在具体的IIC器件中读
; 某一个地址的数据
add.b #0,RXTXI2C
call #I2C_Start
call #I2C_TX
call #I2C_NOAckn
mov.b ADDRI2C0,RXTXI2C
call #I2C_TX
call #I2C_NOAckn
mov.b ADDRI2C1,RXTXI2C ;
call #I2C_TX
call #I2C_NOAckn
mov.b #Code,RXTXI2C
add.b #1,RXTXI2C
call #I2C_Start ;
call #I2C_TX
call #I2C_NOAckn
call #I2C_Read ;
call #I2C_NOAckn
call #I2C_Stop
ret
;-------------------------------------------------------------------------------
I2C_Start bis.b #SCL+SDA,&P4DIR ; 启动总线
bic.b #SCL,&P4OUT
bis.b #SDA,&P4OUT
bis.b #SCL,&P4OUT
CALL #I2CDLY
bic.b #SDA,&P4OUT
CALL #I2CDLY
bic.b #SCL,&P4OUT
bis.b #SDA,&P4OUT
ret
;-------------------------------------------------------------------------------
I2C_TX bis.b #SDA+SCL,P4DIR
mov.b #08h,BITI2C ;向总线发送一个字节
I2C_CLK bic.b #SCL,&P4OUT ;SCL=0
call #I2CDLY
i2c_send rla.b RXTXI2C
jc i2c_send1i2c_send0 bic.b #SDA,&P4OUT
call #I2CDLY
jmp i2c_sx
i2c_send1 bis.b #SDA,&P4OUT
call #I2CDLY
i2c_sx
bis.b #SCL,&P4OUT ;SCL=1
call #I2CDLY
dec.b BITI2C
jnz I2C_CLK
bic.b #SCL,&P4OUT
ret
;-------------------------------------------------------------------------------
I2C_NOAckn bic.b #SDA,&P4DIR
bis.b #SCL,&P4OUT ; 不应答信号
CALL #I2CDLY
bic.b #SCL,&P4OUT
CALL #I2CDLY
ret
;-------------------------------------------------------------------------------
I2C_Ackn bis.b #SDA+SCL,&P4DIR;产生应答
biC.b #SDA,&P4OUT
bis.b #SCL,&P4OUT
call #I2CDLY
bic.b #SCL,P4OUT
nop
bic.b #SDA,&P4OUT
ret
;------------------------------------------------------------------------------- 读一字节
I2C_Read bis.b #SCL,&P4DIR
bic.b #SDA,&P4DIR
bic.b #SCL,&P4OUT
mov.b #08h,BITI2C
I2c_sck bis.b #SCL,&P4OUT
call #I2CDLY
bit.b #SDA, &P4IN
jnz bit1
bit0 bic.b #01h,RI2C
jmp bit_sx
bit1 bis.b #01h,RI2C
bit_sx bic.b #SCL,&P4OUT
call #I2CDLY
dec.b BITI2C
jnz move_bite
jmp ret_1
move_bite rla.b RI2C
jmp I2c_sck
ret_1 ret
;-------------------------------------------------------------------------------
I2C_Stop bis.b #SDA+SCL,&P4DIR
bic.b #SCL,&P4OUT ;停止总线
CALL #I2CDLY
bic.b #SDA,&P4OUT
CALL #I2CDLY
bis.b #SCL,&P4OUT
CALL #I2CDLY
call #I2CDLY
CALL #I2CDLY
bis.b #SDA,&P4OUT
CALL #I2CDLY
bic.b #SCL,&P4OUT
I2C_End ret
;-------------------------------------------------------------------------------
Write_I2C mov.b #Code,RXTXI2C ; 向某一个IIC器件的某
一地址写入具体的数据
add.b #0h,RXTXI2C
call #I2C_Start
call #I2C_TX
call #I2C_NOAckn
mov.b ADDRI2C0,RXTXI2C
call #I2C_TX
call #I2C_NOAckn
mov.b ADDRI2C1,RXTXI2C ; 低地址
call #I2C_TX
call #I2C_NOAckn
mov.b DATAI2C,RXTXI2C ; 数据
call #I2C_TX
call #I2C_NOAckn
call #I2C_Stop
ret
ORG 0FFFEh
DW RESET
END 答 1: 总线启动
I2C_Start bic.b #SCL+SDA,&P4DIR
bis.b #SDA,&P4DIR
bis.b #SCL,&P4DIR
ret
总线停止
I2C_Stop bis.b #SDA,&P4DIR
bic.b #SCL,&P4DIR
bic.b #SDA,&P4DIR
ret
向总线发送一字节数据
I2C_TX mov.b #08,BITI2C
I2C_Send rla.b RXTXI2C
jc I2C_Send1
I2C_Send0 bis.b #SDA,&P4DIR
jmp I2C_Sx
I2C_Send1 bic.b #SDA,&P4DIR
I2C_Sx bic.b #SCL,&P4DIR
CALL I2CDLY
bis.b #SCL,&P4DIR
dec.b BITI2C
jnz I2C_Send
bic.b #SDA,&P4DIR
I2C_Ackn bic.b #SCL,&P4DIR
CALL #I2CDLY
bis.b #SCL,&P4DIR
ret
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |