这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 帮我看看我这程序,急急急!!!!

共2条 1/1 1 跳转至

帮我看看我这程序,急急急!!!!

院士
2006-09-17 18:14:16     打赏
帮我看看我这程序,急急急!!!!



关键词: 帮我     看看     我这     程序     急急    

院士
2006-12-22 22:43:00     打赏
2楼
问 大虾,你们帮帮我。我现在再用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

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]