Em đang dùng con 29466 để đọc thời gian của con DS1307.Em chọn modun I2Cm
mà.Em đã khai báo là CPU clock là clksync/256 với clksync là 5.0V/24Mhz.chân P0.5 là SCL và P0.7 là SCK(2 chân này để ở trạng thái High Z) và nối với con DS1307 nhưng đến lúc lập trình để đọc và ghi thì chân 7 (SQW) của DS chẳng có hiện tượng gì cả.Đến mức em treo 2 chân SCL và SCK của DS bằng trở 10k lên Vcc và lấy luôn cái code Example trong cái datasheet về I2C của Psoc để dịch thế mà con Psoc của em cứ ì ra trong khi cũng nó vẫn sống nhăn răng ra đấy.Rất mong các bác đã làm về I2C của PSoC chỉ giáo cho em,cảm ơn các bác rất nhiều ạ!
include "m8c.inc" ; part specific constants and macros
include "PSoCAPI.inc" ; PSoC API definitions for all User Modules
export _main
area bss (RAM)
sRxData: blk 16
area text (ROM,REL)
.LITERAL
sTxData:
db 0x00 ; Slave internal address 0
db 0x12,0x34,0x08 ; Seconds and minutes in BCD 8:34:12am
db 0x01 ; Day of Week, Monday
db 0x15,0x03,0x02 ; Day-Month-year 15-Mar-02
db 0x93 ; Enable clock output
.ENDLITERAL
_main:
call I2Cm_Start ; Initialize I2C master
mov A,I2Cm_ComleteXfer ; Pass normal transfer mode
push A
mov A,0x09 ; Pass all 9 bytes of sTxData
push A
mov A,>sTxData ; Load the MSB of the sTxData pointer
push A
mov A,<sTxData ; Load the LSB of the sTxData pointer
push A
mov X,SP ; Get the stack location +1
dec X ; That points to the last byte pushed
mov A,0x68 ; Pass slave address 0x68
call _I2Cm_bWriteCBytes ; Call function to write data to slave
; A contains return value.
add SP,-4 ; Restore the stack
RxLoop: ; Keep reading the time from the
; Dallas DS1307
; Do a combined transfer, write then read
; The write sets the sub-address value to 0x00. The read then
; starts reading the values starting at the sub-address 0x00.
;
mov A,I2Cm_NoStop ; Don't generate a stop sequence
push A
mov A,01h ; Write only the first byte of the string
push A ; which is the internal sub-address.
mov A,>sTxData ; Load the MSB of the sTxData pointer
push A
mov A,<sTxData ; Load the LSB of the sTxData pointer
push A
mov X,SP ; Get the stack location +1
dec X ; Dec the pointer to point to the last byte
mov A,0x68 ; Pass slave address 0x68
call _I2Cm_bWriteCBytes ; Call function to write data to slave
; Reg A contains return value.
add SP,-4 ; Restore the stack
mov A,I2Cm_RepStart ; Start with a Repeat start
push A
mov A,0x07 ; Read just the 7 time bytes back
push A
mov A,>sRxData ; Load the MSB of the sRxData pointer
push A
mov A,<sRxData ; Load the LSB of the sRsData pointer
push A
mov X,SP ; Get the stack location +1
dec X ; That points to the last byte pushed
mov A,0x68 ; Pass slave address 0x68
call _I2Cm_fReadBytes ; Call function to read data from slave
; A contains return value.
add SP,-4 ; Restore the stack
jmp RxLoop ; Setting a breakpoint here, you should
; be able to see the returned time data
; in the sRxData RAM locations.
ret
mà.Em đã khai báo là CPU clock là clksync/256 với clksync là 5.0V/24Mhz.chân P0.5 là SCL và P0.7 là SCK(2 chân này để ở trạng thái High Z) và nối với con DS1307 nhưng đến lúc lập trình để đọc và ghi thì chân 7 (SQW) của DS chẳng có hiện tượng gì cả.Đến mức em treo 2 chân SCL và SCK của DS bằng trở 10k lên Vcc và lấy luôn cái code Example trong cái datasheet về I2C của Psoc để dịch thế mà con Psoc của em cứ ì ra trong khi cũng nó vẫn sống nhăn răng ra đấy.Rất mong các bác đã làm về I2C của PSoC chỉ giáo cho em,cảm ơn các bác rất nhiều ạ!
include "m8c.inc" ; part specific constants and macros
include "PSoCAPI.inc" ; PSoC API definitions for all User Modules
export _main
area bss (RAM)
sRxData: blk 16
area text (ROM,REL)
.LITERAL
sTxData:
db 0x00 ; Slave internal address 0
db 0x12,0x34,0x08 ; Seconds and minutes in BCD 8:34:12am
db 0x01 ; Day of Week, Monday
db 0x15,0x03,0x02 ; Day-Month-year 15-Mar-02
db 0x93 ; Enable clock output
.ENDLITERAL
_main:
call I2Cm_Start ; Initialize I2C master
mov A,I2Cm_ComleteXfer ; Pass normal transfer mode
push A
mov A,0x09 ; Pass all 9 bytes of sTxData
push A
mov A,>sTxData ; Load the MSB of the sTxData pointer
push A
mov A,<sTxData ; Load the LSB of the sTxData pointer
push A
mov X,SP ; Get the stack location +1
dec X ; That points to the last byte pushed
mov A,0x68 ; Pass slave address 0x68
call _I2Cm_bWriteCBytes ; Call function to write data to slave
; A contains return value.
add SP,-4 ; Restore the stack
RxLoop: ; Keep reading the time from the
; Dallas DS1307
; Do a combined transfer, write then read
; The write sets the sub-address value to 0x00. The read then
; starts reading the values starting at the sub-address 0x00.
;
mov A,I2Cm_NoStop ; Don't generate a stop sequence
push A
mov A,01h ; Write only the first byte of the string
push A ; which is the internal sub-address.
mov A,>sTxData ; Load the MSB of the sTxData pointer
push A
mov A,<sTxData ; Load the LSB of the sTxData pointer
push A
mov X,SP ; Get the stack location +1
dec X ; Dec the pointer to point to the last byte
mov A,0x68 ; Pass slave address 0x68
call _I2Cm_bWriteCBytes ; Call function to write data to slave
; Reg A contains return value.
add SP,-4 ; Restore the stack
mov A,I2Cm_RepStart ; Start with a Repeat start
push A
mov A,0x07 ; Read just the 7 time bytes back
push A
mov A,>sRxData ; Load the MSB of the sRxData pointer
push A
mov A,<sRxData ; Load the LSB of the sRsData pointer
push A
mov X,SP ; Get the stack location +1
dec X ; That points to the last byte pushed
mov A,0x68 ; Pass slave address 0x68
call _I2Cm_fReadBytes ; Call function to read data from slave
; A contains return value.
add SP,-4 ; Restore the stack
jmp RxLoop ; Setting a breakpoint here, you should
; be able to see the returned time data
; in the sRxData RAM locations.
ret
Comment