BÀI 11: SPI VỚI STM32F1.



  1. Một số khái niệm về lý thuyết.
  2. SPI(Serial Peripheral Interface ) là chuẩn giao tiếp đồng bộ 4 dây do hãng Motorola phát triển. Chuẩn giao tiếp này bao gồm 1 thiết bị Master, 1 hay nhiều thiết bị Slave. Tốc độ giao tiếp SPI cũng là khá cao nên nó được dùng nhiều trong các ứng dụng như: module SIM, module Btultooth, Module wifi, IC nhớ, thẻ nhớ, IC RFID, IC chuyển đổi ADC, đọc tín hiệu vị trí từ IC màn hình, IC dịch bit….
    4 dây của chuẩn giao tiếp SPI bao gồm:
    • SCK: chân này là chân clock, duy trì xung nhịp cho mọi hoạt động truyền nhận. Nhờ có chân này nên SPI là chuẩn giao tiếp đồng bộ và data trong quá trình truyền nhận cũng ít sai sót hơn nhờ sự đồng bộ này. Xung nhịp chỉ do thiết bị Master phát ra.
    • MOSI(Master output slave input) : khi thiết bị được cấu hình là Master thì nó sẽ là chân xuất dữ liệu và khi là Slave thì sẽ là chân nhận dữ liệu.
    • MISO(Master input Slave output) : khi thiết bị được cấu hình là Master thì nó sẽ là chân nhập dữ liệu và khi là Slave thì sẽ là chân xuất dữ liệu.
    • CS – NSS : là chân chọn thiết bị, khi có nhiều thiết bị Slave, chân này sẽ là chân quyết định thiết bị nào sẵn sàng được giao tiếp. Ở 1 số IC nhớ, chân này sẽ là chân cho phép có được giao tiếp(enable) với IC đó hay không.
    STM32f103C8T6 có 2 cổng giao tiếp SPI tốc độ tối đa lên đến 18Mbs/s với nhiều mode cấu hình. Một số tính năng chính của giao tiếp SPI trên MCU này là:
    • Truyền đồng bộ full –duplex trên 3 dây chính, half – duplex, chỉ truyền, chỉ nhận.
    • Cấu hình bằng phần mềm là master hay Slave.
    • Khung truyền cấu hình là 8 hay 16 bit.
    • Cấu hình data truyền theo kiểu MSB hoặc LSB đi trước.
    • Có các cờ báo lỗi, tính năng CRC, cờ ngắt.
    • Có hỗ trợ DMA(bộ truyền tốc độ cao).
  3. Cấu hình sử dụng thư viện chuẩn.
  4. Vd: cấu hình SPI1(Master) và truyền dữ liệu cho SPI2(Slave), khi SP2(Slave) nhận được đúng dữ liệu gửi đi từ SPI1(Master) thì đèn led ở chân PB9 sẽ sáng, dùng ngắt nhận trên cổng SPI2. Khung truyền dữ liệu là 32 byte data.
    Đấu nối dây: thực tế khi chỉ có 1 Master và 1 Slave thì chỉ cần đấu 3 dây CLK, MOSI,MISO là đủ, tuy nhiên khi có nhiều thiết bị Slave thì cần có thêm dây CS, Ở đây mình thêm chân CS cho những trường hợp sau.
    1. Chương trình con cấu hình SPI1 làm Master:
    2. Chân nào nhận dữ liệu từ thiết bị khác thì cấu hình GPIO_Mode_AF_PP và chân truyền thì cấu hình GPIO_Mode_AF_PP, cấu hình mode là Master, truyền 8 bit, 2 bit 1 cạnh xung, tốc độ baud chia 8(tính ra được 9Mbs/s), bit thấp đi trước.
    3. Chương trình con cấu hình SPI2 làm Slave.
    4. Cấu hình tương tự như Master nhưng khác biệt là : Slave, tốc độ baud chia 4(tính ra vẫn được 9Mbs/s độ chia khác nhau nhưng 2 cổng SPI ở 2 nhánh clock hệ thống nhỏ khác nhau).
    5. Chương trình con thực thi ngắt SPI2.
    6. Khi nhảy vào ngắt, chương trình sẽ kiểm tra lại là có nhận data hay chưa và sau đó kiểm tra byte nhận đầu là kí tự ban đầu của chuỗi gửi hay không, tương tự với kí tự cuối cùng. Sau khi xử lý xong quá trình ngắt, cờ báo ngắt nhận sẽ được xóa để phục vụ cho lần ngắt tiếp theo.
    7. Chương trình thực thi trong main.
    8. Nút nhấn PC13 được nhấn thì SP1(Master) sẽ bắt đầu cho phép ngắt nhận ở SPI2(Slave), reset các trạng thái ban đầu và đợi cờ truyền trống, khi cờ truyền trống sẽ thực hiện việc truyền 32 kí tự.
      Flag_end =1 thông báo quá trình xử lí ngắt(trong file it.c) đã thực hiện thành công và không có sai sót. Led ở chân PB9 được bật để hiển thị kết quả. Các data nhận có thể được xem khi debug chương trình.
  5. Một vài thanh ghi quan trọng.
    1. SPI_CR1 - SPI control register.
    2. Thanh ghi này điều khiển chính quá trình truyền nhận data.
      • BIDI MODE: chọn lựa chế độ sử dụng cả 2 dây MOSI và MISO hay chỉ 1 dây.
      • BIDI OE: chọn lựa hướng của data là nhận hoặc truyền.
      • CRCEN: cho phép tính toán CRC(quá trình kiểm tra lỗi ) xảy ra hay không.
      • CRCNEXT : liên quan đến việc thiết lập truyền CRC.
      • DFF: lựa chọn kiểu data là 8 bit hay 16 bit.
      • RXONLY : thiết lập SPI ở chế độ chỉ cho phép nhận hoặc cả truyền và nhận.
      • SSM: liên quan đến việc sử dụng phần mềm để quản lí thiết bị Slave.
      • SSI : liên quan đến việc sử dụng chân CS hay không.
      • LSSBFIRST : cài đặt bit đi đầu là bit cao hay bit thấp của data.
      • SPE: cho phép hoặc không cho phép bộ SPI hoạt động.
      • BR[2:0]: cài đặt baud rate, liên quan đến tốc độ truyền data của cổng SPI.
      • MSTR : cài đặt cổng là Master hay Slave.
      • CPOL, CPHA: liên quan đến việc thiết lập data dich chuyển là cạnh lên hay cạnh xuống của clock.
    3. SPI_SR - SPI status register.
      • BSY: cờ busy flag thông báo trạng thái là SPI đang bận giao tiếp hay rảnh rỗi để truyền nhận data.
      • OVR : overrun flag: thông báo là data đã được nhận hay là chưa nhận xong.
      • MODF : cờ thông báo có lỗi xảy ra trong quá trình truyền hay là không.
      • CRCERR: cờ thông báo CRC xảy ra lỗi hay không.
      • UDR : thông báo có lỗi xảy ra ở thiết bị Slave khi mà đã có clock ở Master mà thiết bị Slave chưa cấu hình xong.
      • TXE: thông báo buffer truyền rỗng hay không.
      • RXE: thông báo buffer nhận rỗng hay không.
    4. SPI_DR – SPI data register.
    5. Thanh ghi này 16 bit chứa dữ liệu của data nhận hoặc gửi.

  6. Bài tập.
    1. Cấu hình SPI1(Master) và truyền dữ liệu cho SPI2(Slave), khi SP2(Slave) nhận được đúng dữ liệu gửi đi từ SPI1(Master) thì đèn led ở chân PB9 sẽ sáng, dùng ngắt nhận trên cổng SPI2. Khung truyền dữ liệu là 32 byte data, tốc độ là 9Mbs/s, LSB đi trước, 2 bit 1 xung clock.
    2. Cấu hình SPI1(Master) và truyền dữ liệu cho SPI2(Slave), khi SPI2(Slave) nhận được dữ liệu thì gửi lại cho SPI1(Master), SPI1(Master) nhận đúng dữ liệu gửi đi thì đèn led ở chân PB9 sẽ sáng, dùng ngắt nhận trên cổng SPI2 và SPI1. Khung truyền dữ liệu là 32 byte data, tốc độ là 9Mbs/s, LSB đi trước, 2 bit 1 xung clock.


Link tải chương trình SPI bài 1
Link tải chương trình SPI bài 2