RTC(Real time clock ) là bộ thời gian thực được tích hợp sẵn trong STM32F103. Thay vì phải gắn thêm IC thời gian thực để đọc được ngày tháng năm, giờ phút giây thì không phải dùng nó khi dùng STM32F103. Một số ứng dụng chính như làm đồng hồ, mạch kiểm soát thời gian, báo thức, bộ đếm thời gian…
Bộ RTC này sử dụng timer độc lập, tách biệt với các timer khác. Việc cài đặt thời gian, đọc thời gian cũng trở nên dễ dàng hơn bằng cách tác động trực tiếp vào các thanh ghi thời gian của MCU.
I2C – Inter- Intergrated Circuit là chuẩn truyền thông 2 dây gồm 1 dây Clock và 1 dây Data dùng chung cho quá trình truyền nhận được phát minh bởi Philips. Chuẩn I2C cũng trở nên thông dụng với nhiều module, IC sử dụng như :IC nhớ(24LCxxx), cảm biến góc nghiêng(MPU6050), module giao tiếp LCD(dùng IC PCF8574), IC thời gian thực(DS1307), IC chuyển đổi tín hiệu số, tương tự… So với UART tốc độ của I2C có vẻ nhỉnh hơn 1 chút, ở mức thông thường là 100Khz. Ở mode còn lại thì tốc độ cao hơn. Khi giao tiếp I2C với 1 IC nào đó cần chú ý : địa chỉ của Ic đó để giao tiếp, giao tiếp với tốc độ bao nhiêu, bao nhiêu bit.
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).
Cấu hình sử dụng thư viện chuẩn.
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.
Chương trình con cấu hình SPI1 làm Master:
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.
Chương trình con cấu hình SPI2 làm Slave.
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).
Chương trình con thực thi ngắt SPI2.
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.
Chương trình thực thi trong main.
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.
Một vài thanh ghi quan trọng.
SPI_CR1 - SPI control register.
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.