Thông báo

Collapse
No announcement yet.

giao tiếp 2 ATmega16 sử dụng SPI

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

  • #16
    Cái mà mình quan tâm và mong đợi bạn trả lời là cái khác cơ. VD:
    - SPI là gì?
    - SPI gồm các tín hiệu gì? Chức năng của từng tín hiệu thế nào?
    - Mã hóa tín hiệu trong SPI thế nào?
    - Các chế độ truyền trong SPI thế nào?
    Chứ còn việc viết phần mềm với cả config trong CV mình ko quan tâm lắm.
    AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
    Xem thêm tại Online Store ---> Click here
    Mob: 0982.083.106

    Comment


    • #17
      Nguyên văn bởi quytim Xem bài viết
      thật ra thì mọi khởi tạo và thiết lập thì dùng cái CodeWInzadAVR của Codeversion nó đã thiết lập cho mình rồi, theo tìm hiểu thì cái khó là phải bật SPI lên đúng lúc truyền dữ liệu, Khi đo bằng oxilo thì đã thấy việc truyền đi (em dùng mạch khác có dùng AT16). nhưng vì truyền 1byte nên khá nhanh, không kiểm tra đc nó truyền và lưu trữ data như thế nào, vì thế mới lên hỏi các Pro mờ
      Khác nhau cơ bản nhất của SPI so với các chuẩn khác như I2C hay UART là dữ liệu được truyền nhận đồng thời.
      Nói một cách dễ hiểu là khi Master truyền 1 byte tới Slave, sau khi kết thúc quá trình truyền thì nó cũng nhận về 1 byte từ Slave. Dữ liệu truyền đi và nhận về dưới dạng nối tiếp, cứ truyền đi 1 bit (trên MOSI) thì cũng sẽ nhận về một bít (trên MISO).

      Chính vì thế, trong CodeVisionAVR, nếu muốn đọc dữ liệu thì Slave, thì Master phải gửi đi một byte 0x00.
      Code:
      result=spi(0);
      PNLab
      Mạch nạp/debug ULink2, Jlink ARM USB
      Mạch nạp AVR, PIC, 8051, MSP430 USB
      Mạch phát triển STM32, ARM9, ARM11
      more...www.pnlabvn.com

      Comment


      • #18
        Hi cả nhà!
        Vấn đề SPI mà cũng lôi kéo tất cả các cao thủ AVR trong diễn đàn rồi, Blackmoon, VnArmy, Sphinx...
        Mình cũng đã làm cái SPI này rồi, truyền thông cũng bình thường thôi, nhưng mình không chơi với anh Protues chỉ dùng cho sinh viên, làm mạch thật tốt hơn. Cái này trên diễn đàn cũng nói nhiều rồi. Code thì trong datasheet cũng nói, tất nhiên là phải biết cách phối hợp, bạn có thể copy nguyên cả hướng dẫn vào là được thôi. Lần sau không được cáu với mấy bậc tiền bối nhé, nhờ vả phải đúng cách, nhất là anh Army anh ý nóng tính lắm.
        Chúc vui và thành công.

        Comment


        • #19
          Anh em cứ 'datasheet' của mega/89S, phần SPI mà đọc thì sẽ trả lời đc những câu hỏi của bác VNArmy thôi. Đọc 1 lần chưa thông thì, 2 lần, ... 10 lần. Mà phải ráp mạch làm thử (cũng đơn giản, cắm qua cắm lại mấy chân ISP), nó o chạy như thế nào? Lúc đó các anh em khác mới cùng trao đổi, vấn đề nó mới hay, nhiều người mới cùng biết. Chứ cứ nói là viết 'code' i chang như sách và mô phỏng không chạy thì chưa đủ!
          !e

          Comment


          • #20
            Cái chương trình bạn quytim viết ở trên ngắn gọn quá, hơi khó hiểu nên các anh em khó mà trả lời. Chằng hạn:
            - Dao động của 'master', 'slaver' là bao nhiêu? (để anh em đoán mò à?)
            - Xung cho SPI là bnhiêu? có giống nhau giữa 'master' và 'slaver' không?
            - SPI chạy ở chế độ mấy? (không nói thì ae muốn biết phải đọc lại 'datasheet' mất thôi)
            - Những câu lệnh như:
            #define DD_MOSI PORTB.5
            #define DD_MISO PORTB.6
            #define DD_SCK PORTB.7
            #define DDR_SPI DDRB
            rồi:
            DDR_SPI = (1<<DD_MISO);
            thì bạn đã chắc là nó như ý mình chưa? Cần gì đến mô phỏng.
            - Bạn nói cấu hình SS bằng phần mềm nhưng mình o thấy đâu, còn nếu bằng phần cứng thì bạn đưa lên cho các anh em xem thế nào!

            Nói chung vấn đề kĩ thuật thì o phải là khó khăn lắm, mình biết trên này có nhiều anh rành mà; vấn đề ở đây là cách trình bày, làm sao cho người khác hiểu rồi mới chia sẻ đc.
            !e

            Comment


            • #21
              Ô thế là bạn Quytim and friends chạy mất roài à. Mình mà học một mình thì lại ko có nhu cầu lắm.
              AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
              Xem thêm tại Online Store ---> Click here
              Mob: 0982.083.106

              Comment


              • #22
                xin chào !nhân tiện nói về SPI mình muôn đóng góp một chương trình nhờ mọi người kiểm tra hộ ,mình mô phỏng chạy dc rồi,chương trình này ko dùng ngắt
                và truyền từng byte một
                Đối với master:
                //các chân MOSI ,SCK,SS đã là đầu ra, các chân PA0,PA2,PA4 là đầu vào
                dc nối với các BUTTON ,PORTC của cả master và slave là đầu ra dc nối
                với 8led đơn
                SPSR=0;
                #asm
                in r30,spdr
                in r31,spsr
                #endasm
                main:
                {
                while(1)
                {
                PORTB.4=1;
                if(PINA.0==0)
                {
                PORTB.4=0;
                #asm
                NOP
                #endasm
                SPDR=0X56;
                while(SPCR.7==0)
                {};
                PORTC=SPDR
                #asm
                in r30,spdr
                in r31,spsr
                #endasm
                }
                if(PINA.2==0)
                {
                PORTB.4=0;
                #asm
                NOP
                #endasm
                SPDR=0X98;
                while(SPCR.7==0)
                {};
                PORTC=SPDR
                #asm
                in r30,spdr
                in r31,spsr
                #endasm
                }
                };
                }
                đối với master tạm thời 2 PINA.0 và PINA.2 đã còn với pin còn lại tương tự
                giải thích chương trình:
                #asm
                in r30,spdr
                in r31,spsr
                #endasm
                là các lệnh xóa cờ SPIF.
                #asm
                NOP
                #endasm
                là độ trễ để cho dữ liệu ổn định trên spdr của slave
                Đối với SLAVE:
                //đã khởi tạo xong cho spi ở chế độ slave
                main:
                {
                while(1)
                {
                if(PINB.4==0)
                {
                SPDR=0x54;
                while(SPCR.7==0)
                {};
                PORTC=SPDR;
                #asm
                in r30,spdr
                in r31,spsr
                #endasm
                }
                };
                }
                xong !mọi người đừng cười nhá

                Comment


                • #23
                  hic
                  tớ cũng đang đau đầu về cái SPI nè.
                  Dùng con ATmega16 làm smater và 1 con làm slave.
                  truyền data 8bit mà chưa làm được nè.
                  mô phỏng protues thì ngon lành mà tới chừng nạp vào cái mạch ....
                  ko chạy được.không biết do mạch hay do cái protues nó lừa mình nữa.
                  hic.xin các bác chỉ giáo
                  các vấn đề về sdcard, usb, tcp/ip, upgrate firmware,...
                  trên các dòng chip: stm32, lpc of nxp
                  please cell phone: 01649895559

                  Comment


                  • #24
                    các bác ơi cho em hỏi về cách truyền và nhận giữa 2 con atmega 8 với nhau theo chuẩn truyền spi với.
                    em cám ơn!

                    Comment


                    • #25
                      Chả thấy ông bạn hỏi gì cả

                      Comment


                      • #26
                        các bác ơi ai có tài liệu giao tiếp giữa 2 con atmega theo chuẩn truyền spi cho em xin với em đang làm đồ án về nó .
                        em xin cám ơn

                        Comment


                        • #27
                          Em xin nhờ các tiền bối giúp đỡ: có thể cho em một bài vi dụ đơn gian về giao tiếp SPI để em biết cách chuyền và nhận tín hiệu qua SPI
                          em xin cảm ơn

                          Comment


                          • #28
                            cho em một bài vi dụ đơn gian về giao tiếp SPI để em biết cách chuyền và nhận tín hiệu qua SPI
                            - SPI (Serial Peripherals Interface) là chuẩn truyền thông nối tiếp đồng bộ (dùng chung tín hiệu clock), song công. Đôi khi người ta cũng gọi nó là chuẩn truyền thông nối tiếp 4 dây.
                            - 4 đường tín hiệu của SPI thường gọi là SS (Slave select), SCK (Serial Clock), MISO (Master input slave output), MOSI (Master output slave input). Ngoài ra người ta cũng có thể gọi với các tên khác như (CLK, SDO, SDI, CS,...)
                            - SPI có thể giao tiếp giữa 2 thiết bị trong đó một thiết bị đóng vai trò là Master, 1 thiết bị đóng vai trò là Slave. Cũng có thể nối chung nhiều thiết bị thành Bus qua chuẩn SPI. Khi đó mạng sẽ có 1 Master và nhiều Slave. Các đường clock và dữ liệu được nối chung, mỗi Slave có một đường SS nối với Master. Số Slave luôn bằng số đường SS.
                            - Khi hai thiết bị trao đổi dữ liệu qua chuẩn SPI chúng thực hiện giống như 2 thanh ghi dịch được kết nối với nhau theo kiểu đầu ra thanh ghi này nối với đầu vào thanh ghi kia. Đầu ra thanh ghi kia nối ngược lại đầu vào thanh ghi này. Mỗi khi có một xung clock cả hai thanh ghi dịch cùng dịch ra một bít và sau 8 lần dịch thì 2 thanh ghi hoán đổi 1 byte dữ liệu cho nhau.
                            - Chi tiết về chuẩn truyền thông SPI các bạn có thể tham khảo ở link sau:
                            http://en.wikipedia.org/wiki/Serial_..._Interface_Bus
                            - Trong file đính kèm là application notes của bọn atmel viết về SPI cho bộ nhớ EEPROM AT93Cxx. Các bạn có thể tham khảo kết nối phần cứng và code mẫu bằng cả Assembly và C
                            Attached Files
                            For a better world

                            Comment


                            • #29
                              Nguyên văn bởi enter88 Xem bài viết
                              xin chào !nhân tiện nói về SPI mình muôn đóng góp một chương trình nhờ mọi người kiểm tra hộ ,mình mô phỏng chạy dc rồi,chương trình này ko dùng ngắt
                              và truyền từng byte một
                              Đối với master:
                              //các chân MOSI ,SCK,SS đã là đầu ra, các chân PA0,PA2,PA4 là đầu vào
                              dc nối với các BUTTON ,PORTC của cả master và slave là đầu ra dc nối
                              với 8led đơn
                              SPSR=0;
                              #asm
                              in r30,spdr
                              in r31,spsr
                              #endasm
                              main:
                              {
                              while(1)
                              {
                              PORTB.4=1;
                              if(PINA.0==0)
                              {
                              PORTB.4=0;
                              #asm
                              NOP
                              #endasm
                              SPDR=0X56;
                              while(SPCR.7==0)
                              {};
                              PORTC=SPDR
                              #asm
                              in r30,spdr
                              in r31,spsr
                              #endasm
                              }
                              if(PINA.2==0)
                              {
                              PORTB.4=0;
                              #asm
                              NOP
                              #endasm
                              SPDR=0X98;
                              while(SPCR.7==0)
                              {};
                              PORTC=SPDR
                              #asm
                              in r30,spdr
                              in r31,spsr
                              #endasm
                              }
                              };
                              }
                              đối với master tạm thời 2 PINA.0 và PINA.2 đã còn với pin còn lại tương tự
                              giải thích chương trình:
                              #asm
                              in r30,spdr
                              in r31,spsr
                              #endasm
                              là các lệnh xóa cờ SPIF.
                              #asm
                              NOP
                              #endasm
                              là độ trễ để cho dữ liệu ổn định trên spdr của slave
                              Đối với SLAVE:
                              //đã khởi tạo xong cho spi ở chế độ slave
                              main:
                              {
                              while(1)
                              {
                              if(PINB.4==0)
                              {
                              SPDR=0x54;
                              while(SPCR.7==0)
                              {};
                              PORTC=SPDR;
                              #asm
                              in r30,spdr
                              in r31,spsr
                              #endasm
                              }
                              };
                              }
                              xong !mọi người đừng cười nhá
                              Bác viết code này nghĩa là bấm nút ở PInA0 thì master truyền 0x56 cho sla và đẩy giá trị trả về từ sla vào port C của mas luôn... ấn nút pinA.2 thì mas gửi 0x98 và đẩy giá trị trả về từ sla vào portC của mas luôn... với sla thì ngay khi đc master gọi sẽ phản hồi về là 0x54 ? E trình bày thế có đúng k ạ ?

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X