Skip to main content

STM32F103C8T6, #6 SPI

SPI là một chuẩn giao tiếp do Motorola đưa ra, được dùng chủ yếu để giao tiếp tầm gần giữa các module trong cùng một hệ thống. SPI có thể truyền dữ liệu hai chiều tại cùng một thời điểm. Đây là một giao thức master/slave, có nghĩa là sẽ có duy nhất một trạm đóng vai trò là master và một hoặc nhiều trạm đóng vai trò là slave. Chỉ master được phép điều khiển việc truyền nhận.

SPI có 4 dây là clock, dây gửi dữ liệu, dây nhận dữ liệu, và dây chọn slave (trong trường hợp có nhiều slave kết nối vào master). Nguyên lý hoạt động là cứ 1 xung clock thì chip sẽ đọc giá trị tại dây data.

SCK - dây clock
MISO - master in, slave out
MOSI - master out, slave in
SS - slave select

SPI được sử dụng khá phổ biến, chẳng hạn trong chip NRF24L01 hoặc trong các loại màn hình LCD, OLED, TFT.

Bài viết này sẽ hướng dẫn bạn cách viết code 1 chương trình SPI đơn giản giao tiếp giữa hai board SM32F103C8T6. Master trên cổng spi1, slave trên cổng spi2, master sẽ định kỳ cứ 2s gửi 1 byte dữ liệu xuống slave, delay 100ms sau đó đọc dữ liệu từ slave gửi lên. Slave mỗi khi nhận được dữ liệu sẽ chớp đèn LED.

Board master
1. Chọn Configuration > SYS > Debug là Serial Wire. SPI1 là full duplex master. PC13 (LED) là GPIO output

2. Trong SPI1, param settings, chọn prescaler là 256 cho tốc độ khoảng 32.25 KBits/s

3. Bật ngắt SPI1

4. Viết code master như sau, sử dụng các hàm HAL_SPI_RxCpltCallback (hàm trả về khi hoàn thành việc nhận dữ liệu), HAL_SPI_Transmit (gửi dữ liệu ở chế độ blocking, tức là gửi dữ liệu xong thì hàm mới trả về và chương trình chính mới tiếp tục thực hiện), HAL_SPI_Receive_IT (hàm nhận dữ liệu ở chế độ non-blocking, tức là hàm sẽ trả về cho chương trình chính ngay lập tức và khi nhận được dữ liệu thì một hàm trả về sẽ được gọi), HAL_SPI_GetState

Board slave
1. Chọn Configuration > SYS > Debug là Serial Wire. SPI2 là full duplex slave. PC13 (LED) là GPIO output

2. Trong SPI2, param settings, chọn prescaler là 256 cho tốc độ khoảng 32.25 KBits/s

3. Bật ngắt SPI2

4. Viết code slave như sau, sử dụng các hàm HAL_SPI_RxCpltCallback, HAL_SPI_Receive_IT, HAL_SPI_Transmit_IT
Trong hàm main, gọi HAL_SPI_Receive_IT(&hspi2, &rx_data, 1); để bắt đầu nhận dữ liệu

Sử dụng hai board STM32F103C8T6, một board nạp code master, một board nạp code slave.
Kết nối:
Master SCK (PA5) <-----> Slave SCK (PB13)
Master MISO (PA6) <-----> Slave MOSI (PB15)
Master MOSI (PA7) <-----> Slave MISO (PB14)
Master GND <-----> Slave GND

Mã nguồn có thể download tại đây https://drive.google.com/open?id=1AOvPiGrNwoRlwYtELKWwN0dfKZZ-D0GQ

Nếu bạn muốn mua board phát triển STM32F103C8T6 thì có thể mua tại đây nhé:


Hoặc bạn có thể mua trên lazada tại link này https://shorten.asia/89DmFg26 mình thấy đang giảm giá.

Comments

Popular posts from this blog

Arduino Nano nạp code không được

Tình trạng Khi bạn nạp code cho arduino nano, IDE sẽ hiển thị là Uploading... rất lâu sau đó báo lỗi: avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: s...

STM32F103C8T6 lỗi không nạp được code

Tình trạng Sau khi nạp code lần đầu, STM32 ST-Link Utility sẽ không kết nối được nữa và hiện lên thông báo lỗi: Cannot connect to target! Please select "Connect Under Reset" mode from Target -> Settings menu and try again. If you are trying to connect to low frequency application, please select a lower SWD Frequency mode from Target -> Settings menu. Tình trạng này có thể xảy ra với tất cả các dòng F1 và cách khắc phục cũng tương tự nhau. Khắc phục 1. Trong STM32CubeMX cần phải chọn lại trong SYS > Debug là Serial Wire sau đó generate lại code. 2. Board arm kết nối ST-Link Utility không được, lúc đó hãy nhấn giữ nút Reset trên board rồi nhấn nút Connect trên ST-Link Utility, chờ khoảng 3-5 giây sau đó thả nút Reset. Có thể bạn sẽ phải làm vài lần như vậy mới có được 1 lần kết nối thành công. 3. Sau khi kết nối thành công, nạp code mới có config Debug là Serial Wire ở trên. Khi đó board sẽ kết nối bình thường cho các lần tiếp theo Mạch nạp ST-LINK có thể m...

Dùng mạch nạp USBasp để nạp code cho Arduino

Arduino có thể dễ dàng nạp code và chạy chương trình chỉ với thao tác đơn giản cắm board mạch vào máy tính chọn cổng COM và nhấn nút Upload. Để làm được như vậy, bên trong chip vi xử lý được nạp sẵn một đoạn mã lệnh gọi là boot loader. Boot loader luôn luôn được chạy lên đầu tiên, sau đó mới chuyển quyền điều khiển lại cho phần mã của người dùng nạp vào.   Như vậy để các Chip Arduino có thể làm việc được với Arduino IDE thông qua giao tiếp USB-COM thì trong vi điều khiển phải được nạp sẵn boot loader. Các board mạch Arduino bán sẵn trên thị trường như Arduino Uno, Arduino Nano, Arduino Mega 2560,... đều được nạp sẵn boot loader. Như vậy ưu điểm của boot loader là để người dùng dễ dàng tiếp cận, thử nghiệm, và làm ra được sản phẩm nhanh chóng, dễ dàng. Nhưng nhược điểm là boot loader luôn luôn cần một khoảng thời gian từ 1.6s đến 2s để khởi động. Nếu bạn không muốn mất 1.6 - 2s đầu tiên mà muốn chương trình chạy gần như ngay lập tức khi cấp nguồn hoặc reset thì dùng mạch nạp USBasp ...