... qua cổng USB • Lập trình giao tiếp ADC Lập trình nhúng ARM-Linux 81 Nội dung học 3. 1 Giới thiệu chuẩn RS 232 3. 2 Lập trình giao tiếp chuẩn RS 232 3. 3 Giới thiệu chuẩn USB 3. 4 Lập trình giao tiếp... dùng nhấn c|c nút Lập trình nhúng ARM-Linux 118 QT Joystick Demo Lập trình nhúng ARM-Linux 119 3. 5 Lập trình giao tiếp ADC Giới thiệu ADC Minh họa lập trình ADC Lập trình nhúng ARM-Linux 120... điện áp) 88 Lập trình nhúng ARM-Linux Chuẩn RS 232 Kịch truyền Ghép nối không bắt tay hai thiết bị (Khác mức điện áp) 89 Lập trình nhúng ARM-Linux 3. 2 Lập trình giao tiếp chuẩn RS 232
Trang 1Chương 3
Lập trình vào ra nâng cao
Trang 2• Nắm được chuẩn giao tiếp USB
• Lập trình ghép nối USB Joystick qua cổng USB
• Lập trình giao tiếp ADC
81
Trang 3Nội dung bài học
3.1 Giới thiệu chuẩn RS232
3.2 Lập trình giao tiếp chuẩn RS232
3.3 Giới thiệu chuẩn USB
3.4 Lập trình giao tiếp USB Joystick
3.5 Lập trình giao tiếp ADC
Trang 4Lập trình nhúng ARM-Linux
3.1 Giới thiệu chuẩn RS232
Mức điện |p đường truyền
Chuẩn đầu nối trên m|y tính PC
Khuôn dạng khung truyền
Tốc độ truyền
Kịch bản truyền
83
Trang 5Chuẩn RS232
Mức điện |p đường truyền (Chuẩn RS-232C)
Trang 7Chuẩn RS232
Chuẩn đầu nối trên PC
• Chân 1 (DCD-Data Carrier Detect):
ph|t hiện tín hiệu mang dữ liệu
• Chân 2 (RxD-Receive Data): nhận dữ
liệu
• Chân 3 (TxD-Transmit Data): truyền
dữ liệu
• Chân 4 (DTR-Data Terminal Ready):
đầu cuối dữ liệu sẵn s{ng
• Ch}n 5 (Signal Ground): đất của tín
Trang 8Lập trình nhúng ARM-Linux
Chuẩn RS232
Khuôn dạng khung truyền
• PC truyền nhận dữ liệu qua cổng nối tiếp RS-232 thực
hiện theo kiểu không đồng bộ (Asynchronous)
• Khung truyền gồm 4 th{nh phần
1 Start bit (Mức logic 0): bắt đầu một gói tin, đồng bộ xung nhịp clock giữa DTE v{ DCE
Data (5,6,7,8 bit): dữ liệu cần truyền
1 parity bit (chẵn (even), lẻ (odd), mark, space): bit cho phép kiểm tra lỗi
Stop bit (1 hoặc 2 bit): kết thúc một gói tin
87
Trang 9Chuẩn RS232
Kịch bản truyền
• Không có bắt tay (none-handshaking): m|y thu có khả
năng đọc c|c ký tự thu trước khi m|y ph|t truyền ký tự
tiếp theo
Trang 113.2 Lập trình giao tiếp chuẩn RS232
Khởi tạo: Khai b|o thư viện
Bước 1: Mở cổng
Bước 2: Thiết lập tham số
Bước 3: Đọc, ghi cổng
Bước 4: Đóng cổng
Trang 12 #include <unistd.h> // UNIX standard function
#include <fcntl.h> // File control definitions
#include <errno.h> // Error number definitions
#include <termios.h> // POSIX terminal control
#include <time.h> // time calls
91
Trang 13Bước 1: Mở cổng
Sử dụng lệnh mở file
int fd = open ("/dev/ttySAC0", O_RDWR);
Fd >0 nếu mở file th{nh công
Fd<0 nếu mở file thất bại
Trang 14port_settings.c_cflag &= ~PARENB;
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &port_settings);
93
Trang 15Bước 3: Đọc, ghi cổng
Đọc cổng: sử dụng lệnh đọc file
n=read(fd,&result,sizeof(result));
N: số ký tự đọc được
Result: chứa kết quả
Ghi cổng: sử dụng lệnh ghi file
n=write(fd,“Hello World\r",12);
N:số ký tự đ~ ghi
Fd: file id (có được từ thao t|c mở file th{nh công)
Trang 17Demo
Trang 18Lập trình nhúng ARM-Linux
3.3 Giới thiệu chuẩn USB
Năm 1995: USB 1.0
• Tốc độ Low-Speed: 1.5 Mbps
• Tốc độ tối đa (Full-Speed): 12 Mbps
Năm 1998: USB 1.1 (Sửa lỗi của USB 1.0)
• Tốc độ tối đa (Full-Speed): 12 Mbps
Trang 19Tín hiệu chuẩn USB
Tín hiệu
• Truyền kiểu nối tiếp
• Tín hiệu trên hai đường D+ và D- là tín hiệu vi sai
Trang 20Lập trình nhúng ARM-Linux
Mô hình bus USB
99
Trang 21Vai trò của các thành phần
Vai trò của USB host:
• Trao đổi dữ liệu với c|c thiết bị ngoại vi
• Điều khiển USB bus:
Quản lý được c|c thiết bị kết nối v{o đường bus v{
khả năng của mỗi thiết bị đó: sử dụng cơ chế điểm danh (Enumeration)
Ph}n xử, quản lý luồng dữ liệu trên bus, đảm bảo c|c thiết bị đều có cơ hội trao đổi dữ liệu
• Kiểm tra lỗi: thêm c|c m~ kiểm tra lỗi v{o gói tin
cho phép ph|t hiện lỗi v{ yêu cầu truyền lại gói tin
Trang 22Lập trình nhúng ARM-Linux
Vai trò của các thành phần
Vai trò của thiết bị ngoại vi
• Trao đổi dữ liệu với host
• Ph|t hiện c|c gói tin hay yêu cầu (request) được gửi tới thiết bị để xử lý phù hợp
• Kiểm tra lỗi: tương tự như Host, c|c thiết bị ngoại vi cũng phải chèn thêm c|c bit kiểm tra lỗi v{o gói tin gửi đi
• Quản lý nguồn điện: c|c thiết bị có thể sử dụng
nguồn điện ngo{i hay nguồn từ bus Nếu sử dụng
nguồn từ bus, phải chuyển sang chế độ tiết kiệm
điện năng
101
Trang 23Endpoint & pipes
Mỗi qu| trình truyền nhận dữ liệu bao gồm một
hay nhiều giao dịch (transactions), mỗi giao dịch
gồm một hay nhiều packets
-> Để hiểu được c|c giao dịch, c|c packet v{ nội dung của chúng -> cần tìm hiểu hai kh|i niệm Endpoint
và Pipes
Trang 24Lập trình nhúng ARM-Linux
Endpoint
Endpoint của thiết bị:
• Chỉ có thiết bị mới có Endpoint, Host không có
Endpoint
• Endpoint l{ bộ đệm (gửi, nhận)
• C|c Endpoint được đ|nh địa chỉ v{ x|c định hướng
In Endpoint: bộ đệm gửi
Out Endpoint: bộ đệm nhận
• Tất cả c|c thiết bị đều phải có Endpoint 0, đ}y l{
endpoint mặc định để gửi c|c thông tin điều khiển
103
Trang 25Pipes
Pipes: kết nối Endpoint của thiết bị tới Host
• Phải thiết lập pipe trước khi muốn trao đổi dữ liệu
• Host thiết lập pipe trong qu| trình điểm danh
Trang 26Lập trình nhúng ARM-Linux
Device Classes
C|c thiết bị ngoại vi cùng chức năng (chuột, m|y in, ổ nhớ flash…) có đặc tính truyền nhận dữ liệu chung -> Hệ điều
h{nh có thể cung cấp driver chung cho c|c nhóm, c|c nh{
sản xuất thiết bị không cần viết driver riêng
C|c nhóm thiết bị đ~ được định nghĩa
Trang 27Quá trình trao đổi dữ liệu
C|c thiết bị USB có thể trao đổi dữ liệu với Host
theo 4 kiểu ho{n to{n kh|c nhau, cụ thể:
• Truyền điều khiển (control transfer)
• Truyền ngắt (interrupt transfer)
• Truyền theo khối (bulk transfer)
• Truyền đẳng thời (isochronous transfer)
Trang 28Lập trình nhúng ARM-Linux
Các kiểu truyền
Truyền điều khiển: để điều khiển phần cứng, c|c
yêu cầu điều khiển được truyền Chúng l{m việc
với mức ưu tiên cao v{ với khả năng kiểm so|t lỗi
tự động Tốc độ truyền lớn vì có đến 64 byte trong một yêu cầu (request) có thể được truyền
Truyền ngắt: c|c thiết bị, cung cấp một lượng dữ
liệu nhỏ, tuần ho{n chẳng hạn như chuột, b{n phím đều sử dụng kiểu truyền n{y Hệ thống sẽ hỏi theo chu kỳ, chẳng hạn 10ms một lần xem có c|c dữ liệu mới gửi đến
107
Trang 29Các kiểu truyền
Truyền theo khối: khi có lượng dữ liệu lớn cần
truyền v{ cần kiểm so|t lỗi truyền nhưng lại không
có yêu cầu thúc ép về thời gian truyền thì dữ liệu
thường được truyền theo khối VD: m|y in, m|y
quét
Truyền đẳng thời: khi có khối lượng dữ liệu lớn
với tốc độ dữ liệu đ~ được quy định, ví dụ như card }m thanh Theo c|ch truyền n{y một gi| trị tốc độ
Trang 30Lập trình nhúng ARM-Linux
3.4 Lập trình giao tiếp USB Joystick
109
Trang 31Cấu trúc JOYINFO trên Windows
Windows định nghĩa cấu trúc JOYINFO để lưu c|c
thông tin về tình trạng c|c nút bấm trên Joystick
Nút trái, phải Nút lên, xuống
Các nút chức năng: 1, 2, 3, 4, L1, L2, R1, R2,
Trang 32Lập trình nhúng ARM-Linux
Cấu trúc JOYINFO
wXpos
• wXpos=0 -> nút sang tr|i được bấm
• wXpos=65535 -> nút sang phải được bấm
wYpos
• wYpos=0 -> nút lên được bấm
• wYpos=65535 -> nút xuống được bấm
wButtons: mỗi bit biểu diễn trạng th|i của một nút chức năng
• VD: Button 1 -> bit 0, Button 2 -> bit 1…
111
Trang 33Cấu trúc js_event trên Linux
Linux định nghĩa cấu trúc js_event để lưu c|c thông tin khi có ph|t sinh sự kiện (khởi tạo thiết bị,
người dùng bấm nút chức năng, nút chỉnh hướng)
Định nghĩa trong include/linux/joystick.h
Trang 34Lập trình nhúng ARM-Linux
Cấu trúc js_event
Nội dung c|c trường dữ liệu
• Time: nh~n thời gian ph|t sinh sự kiện
• Value: gi| trị, phụ thuộc v{o nút chức năng hay nút
chỉnh hướng
Nút chức năng: 0/1
Nút chỉnh hướng: -32768 -> 32767
• Type: loại sự kiện
Khởi tạo thiết bị: 0x80
Nút chỉnh hướng: 0x02
Nút chức năng: 0x01
• Number: x|c định nút được nhấn
113
Trang 36Lập trình nhúng ARM-Linux
Lập trình kết nối joystick
Đọc dữ liệu từ thiết bị (khi có phát sinh sự
kiện)
bytes = read(joystick_fd, jse, sizeof(*jse));
joystick_fd: con trỏ file có được khi mở file
jse: biến cấu trúc js_event
bytes: Tổng số file đọc được, nếu số n{y bằng kích thước của cấu trúc js_event thì qu| trình đọc th{nh công
115
Trang 37Demo
Trang 38Lập trình nhúng ARM-Linux
Kết quả demo
C|c sự kiện khi khởi tạo thiết bị
117
Trang 39Kết quả demo
C|c sự kiện khi người dùng nhấn c|c nút
Trang 40Lập trình nhúng ARM-Linux
QT Joystick Demo
119
Trang 413.5 Lập trình giao tiếp ADC
Giới thiệu ADC
Minh họa lập trình ADC
Trang 42Lập trình nhúng ARM-Linux
Giới thiệu ADC
ADC: Analog to Digital Converter
• Thông số quan trọng của ADC
• Dải điện |p chuyển đổi
• ADC 8 bit, 10 bit, 12 bit…
• Bao nhiêu kênh?
• Độ ph}n ly
121
Trang 43Minh họa lập trình ADC
Khai b|o thư viện