Thông báo

Collapse
No announcement yet.

Giúp em về I2C của Psoc với!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp em về I2C của Psoc với!

    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
    Thiết kế, sửa chữa PLC,HMI, Servo,biến tần, máy tính công nghiệp
    Lập trình ứng dụng VĐK, IC logic lập trình được (PAL,GAL, FPGA...)
    DT:098 861 4347

  • #2
    bạn tìm trong diễn đàn xem.mình nhớ không nhầm thì các bạn đã post code của PIC,AVR,PSoC cho DS1307 rồi đấy.cả schematic nữa.chịu khó tìm vậy.chắc chắn sẽ thấy

    Comment


    • #3
      Code viết bằng asm khó đọc quá. Nhưng bạn hãy kiểm tra lại sơ đồ nguyên lý xem. Nhất định 2 chân SCL và SDA phải có trở treo. Thường thì từ 1K8 đến 2k2. Còn về phần mềm mềm thì bạn chú ý xem lại các chân SCL và SDA đã được cấu hình đúng hay chưa. Tiếp theo là cách khởi tạo DS đã đúng và đủ chưa. Mình nghĩ chỉ có mấy vấn đề đó thôi. Nhu vậy là đủ để DS chạy rùi. Chúc bạn thành công.
      Kel'Thuzads
      Mail:minhnguyen.ac@gmail.com

      Comment


      • #4
        Về vấn đề khởi tạo DS em cũng không rõ lắm bởi vì trong datasheet của DS không nói tới cái địa chỉ của DS mà chỉ đề cập đến thanh ghi ở địa chỉ 07H thôi.Em khởi tạo DS bằng cách ghi giá trị 0x90 vào thanh ghi này nhưng chẳng thấy cái chân SQW có xung gì cả!
        Trong chương trình VD của PSoc lại đề cập đến địa chỉ của DS trên bus I2C là 0x68.Vậy địa chỉ đó là thế nào vậy ạ?
        Còn về trở treo thì em sẽ thử với giá trị như bác Kel'Thuzads nói xem vì hiện tại em đang thử với trở 10k mà.
        Thiết kế, sửa chữa PLC,HMI, Servo,biến tần, máy tính công nghiệp
        Lập trình ứng dụng VĐK, IC logic lập trình được (PAL,GAL, FPGA...)
        DT:098 861 4347

        Comment


        • #5
          Địa chỉ Slave của DS1307 là 0xD0. Địa chỉ này đã được nhà sản xuất quy định từ trước.
          - Nếu ghi dữ liệu và DS1307 thì địa chỉ của nó là 0xD0
          - Nếu đọc dữ liệu thì địa chỉ của nó là 0xD1
          - Việc quy định địa chỉ này bạn hãy xem kỹ lại datasheet
          Trong hàm khởi tạo cho DS1307 bạn làm như sau:
          - ghi 0xd0 tới ds để chọn ds
          - ghi 0x00 để chọn địa chỉ của dữ liệu cần ghi (ở đây là vị trí giây). Con trỏ địa chỉ trỏ vào vùng địa chỉ 0x00.
          - ghi giá trị giây cần khởi tạo
          - ghi giá trị phút cần khởi tạo
          - ghi giá trị giờ cần khởi tạo
          - ghi giá trị thứ cần khởi tạo
          - ghi giá trị ngày cần khởi tạo
          - ghi giá trị tháng cần khởi tạo
          - ghi giá trị năm cần khởi tạo
          - sau cuối là ghi 0x90 (là byte điều khiển) cần khởi tạo
          Chú ý, nếu ghi lần lượt các byte liên tiếp thì con trỏ địa chỉ tự động tăng lên. Chính vì vậy mà ở trên ta chỉ cần chọn địa chỉ cần ghi là giây thôi.
          Chúc bạn thành công!
          Kel'Thuzads
          Mail:minhnguyen.ac@gmail.com

          Comment


          • #6
            Cảm ơn bác Kel'Thuzads rất nhiều.để em thử lại đã nhé.Hóa ra cái địa chỉ của DS lại là 0xD0.Em đọc kỹ cái Datasheet nhưng ko thấy nói.chắc người ta quên mất hoặc em down phải cái bản rút gọn chăng.Vậy tất cả các con DS1307xxx đều có địa chỉ như nhau phải không ạ hay là địa chỉ của DS1307 khác với DS1307N?
            Thiết kế, sửa chữa PLC,HMI, Servo,biến tần, máy tính công nghiệp
            Lập trình ứng dụng VĐK, IC logic lập trình được (PAL,GAL, FPGA...)
            DT:098 861 4347

            Comment


            • #7
              Nếu mình không nhầm thì đúng như vậy, kể các đống DS1337 cũng thế. Để biết đc có đúng hay không bạn hãy xem lại qui tắc ghi và đọc dữ liệu có trong Datasheet đó. (những con nào có giao tiếp I2C đều đưa ra quy tắc như vậy)
              Chúc thành công.
              Attached Files
              Kel'Thuzads
              Mail:minhnguyen.ac@gmail.com

              Comment


              • #8
                Nguyên văn bởi emut Xem bài viết
                Cảm ơn bác Kel'Thuzads rất nhiều.để em thử lại đã nhé.Hóa ra cái địa chỉ của DS lại là 0xD0.Em đọc kỹ cái Datasheet nhưng ko thấy nói.chắc người ta quên mất hoặc em down phải cái bản rút gọn chăng.Vậy tất cả các con DS1307xxx đều có địa chỉ như nhau phải không ạ hay là địa chỉ của DS1307 khác với DS1307N?
                Địa chỉ 0xD0 là địa chỉ DS1307 do nhà sản xuất quy định, khi sử dụng với các hàm trong PSoC thì phải dịch địa chỉ này đi 1 bit. 0xD0 >> 1 = 0x68. Thế nên khi lập trình vẫn phải để 0x68 mới chính xác.
                CUNG CẤP PSOC, MẠCH NẠP
                CHUYỂN ĐỔI USB <-> RS485 AutoBaud
                RS232 <-> RS485 MultiBaud
                MẠCH NẠP USBPPI S7-200
                Mobile: 0906076116
                Email:

                Comment

                Về tác giả

                Collapse

                emut Tìm hiểu thêm về emut

                Bài viết mới nhất

                Collapse

                Đang tải...
                X