Bài giảng Lập trình nhúng ARM-Linux - Chương 3: Lập trình vào ra nâng cao

pdf 44 trang phuongnguyen 3800
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình nhúng ARM-Linux - Chương 3: Lập trình vào ra nâng cao", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_nhung_arm_linux_chuong_3_lap_trinh_vao_r.pdf

Nội dung text: Bài giảng Lập trình nhúng ARM-Linux - Chương 3: Lập trình vào ra nâng cao

  1. Chương 3 Lập trình vào ra nâng cao Lập trình nhúng ARM-Linux 80
  2. Mục tiêu chương 3 . Sau khi kết thúc chương n{y, sinh viên có thể • Nắm được chuẩn RS232 • Lập trình giao tiếp chuẩn RS232 trên kit nhúng Micro2440 • 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 Lập trình nhúng ARM-Linux 81
  3. Nộ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 Lập trình nhúng ARM-Linux 82
  4. 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 Lập trình nhúng ARM-Linux 83
  5. Chuẩn RS232 . Mức điện |p đường truyền (Chuẩn RS-232C) 84 Lập trình nhúng ARM-Linux
  6. Chuẩn RS232 . Chuẩn đấu nối trên PC UART UART UART (Universal Asynchronous receiver/transmitter) 85 Lập trình nhúng ARM-Linux
  7. Chuẩ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 hiệu • Chân 6 (DSR-Data Set Ready): dữ liệu sẵn s{ng • Chân 7 (RTS-Request To Send): yêu cầu gửi • Chân 8 (CTS-Clear To Send): Xóa để gửi • Chân 9 (RI-Ring Indicate): báo chuông 86 Lập trình nhúng ARM-Linux
  8. 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 Lập trình nhúng ARM-Linux
  9. Chuẩ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 Kết nối không cần bắt tay giữa hai thiết bị (cùng mức điện áp) 88 Lập trình nhúng ARM-Linux
  10. Chuẩn RS232 . Kịch bản truyền Ghép nối không bắt tay giữa hai thiết bị (Khác nhau về mức điện áp) 89 Lập trình nhúng ARM-Linux
  11. 3.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 Lập trình nhúng ARM-Linux 90
  12. Khai báo thư viện . #include . #include . #include . #include // UNIX standard function . #include // File control definitions . #include // Error number definitions . #include // POSIX terminal control . #include // time calls Lập trình nhúng ARM-Linux 91
  13. Bướ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 Lập trình nhúng ARM-Linux 92
  14. Bước 2: Thiết lập tham số . Sử dụng cấu trúc termios struct termios port_settings; . Thiết lập tham số (9600, 8, n, 1) cfsetispeed(&port_settings, B9600); cfsetospeed(&port_settings, B9600); port_settings.c_cflag &= ~PARENB; port_settings.c_cflag &= ~CSTOPB; port_settings.c_cflag &= ~CSIZE; port_settings.c_cflag |= CS8; tcsetattr(fd, TCSANOW, &port_settings); Lập trình nhúng ARM-Linux 93
  15. Bướ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) Lập trình nhúng ARM-Linux 94
  16. Bước 4: Đóng cổng . Đóng cổng: sử dụng lệnh đóng file close (fd); Fd: file ID (có được từ thao t|c mở file th{nh công) Lập trình nhúng ARM-Linux 95
  17. Demo Lập trình nhúng ARM-Linux 96
  18. 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 . Năm 2001: USB 2.0 • Tốc độ tối đa (High-Speed): 480 Mbps . Năm 2008: USB 3.0 • Tốc độ tối đa (Super-Speed): 4.8 Gbps Lập trình nhúng ARM-Linux 97
  19. Tí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 Lập trình nhúng ARM-Linux 98
  20. Mô hình bus USB Lập trình nhúng ARM-Linux 99
  21. Vai 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 • Cung cấp nguồn điện cho tất cả c|c thiết bị Lập trình nhúng ARM-Linux 100
  22. 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. Lập trình nhúng ARM-Linux 101
  23. Endpoint & 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 Lập trình nhúng ARM-Linux 102
  24. 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 Lập trình nhúng ARM-Linux 103
  25. Pipes . 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 (Enumeration) • C|c Pipe sẽ được hủy khi thiết bị ngắt kết nối khỏi bus • Tất cả c|c thiết bị đều có một đường ống điều khiển (control pipe) mặc định sử dụng Endpoint 0 Lập trình nhúng ARM-Linux 104
  26. 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 • Audio • Communication devices • Human interface (HID) • IrDA Bridge • Mass Storage • Cameras and scanners • Video Lập trình nhúng ARM-Linux 105
  27. Quá 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) Lập trình nhúng ARM-Linux 106
  28. 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. Lập trình nhúng ARM-Linux 107
  29. Cá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 độ x|c định được duy trì. Việc hiệu chỉnh lỗi không được thực hiện vì những lỗi truyền lẻ tẻ cũng không g}y ảnh hưởng đ|ng kể. Lập trình nhúng ARM-Linux 108
  30. 3.4. Lập trình giao tiếp USB Joystick Lập trình nhúng ARM-Linux 109
  31. Cấ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, Select, Start Lập trình nhúng ARM-Linux 110
  32. 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 Lập trình nhúng ARM-Linux 111
  33. Cấ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 Lập trình nhúng ARM-Linux 112
  34. 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 Lập trình nhúng ARM-Linux 113
  35. Lập trình kết nối joystick . Mở file thiết bị: joystick_fd = open(JOYSTICK_DEVNAME, O_RDONLY | O_NONBLOCK); . JOYSTICK_DEVNAME: tên của file thiết bị, thường là /dev/input/js0 . O_RDONLY | O_NONBLOCK: mở file chỉ đọc ở chế độ NONBLOCK Lập trình nhúng ARM-Linux 114
  36. 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 Lập trình nhúng ARM-Linux 115
  37. Demo Lập trình nhúng ARM-Linux 116
  38. Kết quả demo . C|c sự kiện khi khởi tạo thiết bị Lập trình nhúng ARM-Linux 117
  39. Kết quả demo . C|c sự kiện khi người dùng nhấn c|c nút Lập trình nhúng ARM-Linux 118
  40. QT Joystick Demo Lập trình nhúng ARM-Linux 119
  41. 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
  42. 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 Lập trình nhúng ARM-Linux 121
  43. Minh họa lập trình ADC . Khai b|o thư viện #include #include #include #include #include #include #include #include #include #include Lập trình nhúng ARM-Linux 122
  44. Minh họa lập trình ADC int main(void){ fprintf(stderr, "press Ctrl-C to stop\n"); int fd = open("/dev/adc", 0); if (fd 0) { buffer[len] = '\0'; int value = -1; sscanf(buffer, "%d", &value); printf("ADC Value: %d\n", value); } else { perror("read ADC device:"); return 1; } usleep(500* 1000); } close(fd); } Lập trình nhúng ARM-Linux 123