Tôi mới nhận ra rằng họ 8051 sử dụng 11.0592 MHz và bội số của nó để tạo ra tốc độ truyền chuẩn. Nhưng có những SoC sử dụng 15 MHz. Làm thế nào để họ làm điều này sau đó?
Tôi mới nhận ra rằng họ 8051 sử dụng 11.0592 MHz và bội số của nó để tạo ra tốc độ truyền chuẩn. Nhưng có những SoC sử dụng 15 MHz. Làm thế nào để họ làm điều này sau đó?
Câu trả lời:
UART không quan tâm miễn là nó chính xác một cách hợp lý.
Vì vậy, UART của bạn sẽ trở nên quá nhanh bởi hệ số . Nó trở thành một vấn đề ở , khi sự thay đổi thời gian trên 11 bit là hơn một nửa bit.1+1
Dưới đây là mô tả tính năng 'bản in lớn' của MCU ARM tương đối cao cấp.
Có một số PLL và bộ chia với bộ đếm gộp trước và bộ chia tín hiệu có khả năng tạo ra hầu hết mọi tần số bạn có thể cần dưới dạng tỷ lệ số nguyên. Các PLL nhân lên của nó tần số đầu vào của một số nguyên, và một bộ chia có thể chia cho một số số ( không nhất thiết là lũy thừa của 2 trong từng trường hợp).
Tần số bên trong tương đối cao (khoảng nửa GHz trong trường hợp này) không phải là vấn đề (vì chúng sẽ bị tắt chip) - tiêu thụ ít năng lượng.
Thời của sự phân chia chỉ bằng sức mạnh của 2 đã kết thúc cách đây khá lâu và bây giờ PLL thường được áp dụng, chúng ta không cần phải lo lắng về tần số tinh thể chính xác gần như nhiều. Mặt khác, chúng ta có thể cần nhiều tần số xung nhịp khác nhau cho nhiều đồng hồ bus bên trong, USB, Ethernet, UART, v.v.
Nếu bạn muốn tìm hiểu thêm về cách thức hoạt động của chúng, bạn có thể nghiên cứu một số chip tổng hợp đồng hồ chuyên dụng tương đối đơn giản (mặc dù vẫn đủ phức tạp để một số nhà sản xuất cung cấp phần mềm để tính các hằng số thiết lập).
Điều này có thể đạt được bằng cách sử dụng một bộ điều biến .
Xem ví dụ hướng dẫn sử dụng MSP430x1xx . Trên trang 260 có ghi:
Bộ tạo tốc độ baud USART có khả năng tạo ra tốc độ baud tiêu chuẩn từ các tần số nguồn không chuẩn. Bộ tạo tốc độ baud sử dụng một bộ chia tỷ lệ / bộ chia và bộ điều biến như trong Hình 13−7. Sự kết hợp này hỗ trợ các ước số phân số để tạo tốc độ baud.
(lưu ý vùng màu xám)
Hệ số chia N thường là một giá trị không nguyên trong đó phần nguyên có thể được nhận ra bởi bộ chia / bộ chia. Giai đoạn thứ hai của bộ tạo tốc độ baud, bộ điều biến, được sử dụng để đáp ứng phần phân đoạn càng sát càng tốt.
[...]
BITCLK có thể được điều chỉnh từ bit này sang bit khác với bộ điều biến để đáp ứng các yêu cầu về thời gian khi cần một ước số không nguyên. Thời gian của mỗi bit được mở rộng bằng một chu kỳ xung nhịp BRCLK nếu bit mi điều biến được đặt. Mỗi lần nhận hoặc truyền một bit, bit tiếp theo trong thanh ghi điều khiển điều chế sẽ xác định thời gian cho bit đó. Một bit điều chế được thiết lập làm tăng hệ số chia cho một trong khi bit điều chế bị xóa duy trì hệ số chia được đưa ra bởi UxBR
[...]
Rất nhiều người cho rằng UART thực sự đang chạy trên một chiếc đồng hồ cố định, tức là bạn lấy mẫu mỗi giây. Điều này không thực sự đúng. Ít nhất là không phải trong tất cả các mô-đun UART mà tôi đã thiết kế.
Cách nó hoạt động là bạn có một đồng hồ mẫu nội bộ. Nói rằng bạn có thể lấy mẫu mỗi 100ns. Bạn biết vị trí giữa của mỗi bit. Vì vậy, bạn chọn một điểm lấy mẫu gần nhất ở giữa. Điều này sẽ cung cấp cho bạn một lỗi 50ns nhiều nhất.
Điều gì xảy ra là bạn nhận được bit bắt đầu. Sau đó, bạn xác định vị trí giữa của bit, đó là điểm tham chiếu của bạn. Sau đó, bạn biết bạn cần đợi bao lâu để lấy mẫu bit tiếp theo. Vì vậy, bạn tải lên một bộ đếm và khi nó đặt lại mẫu của bạn. Bây giờ, bạn sẽ tắt tối đa 1 chu kỳ của đồng hồ bên trong nhanh, nhưng đó là nano giây trong hầu hết các trường hợp. Ngoài ra, bạn biết bạn nghỉ bao nhiêu. Đối với bit tiếp theo, bạn tải bộ đếm của mình với một giá trị khác, vì vậy bạn càng gần càng tốt đến giữa, v.v.
Trong các hệ thống thực tế có rất nhiều điều khác cũng xảy ra. Ví dụ: bạn không lấy một mẫu, bạn có thể lấy một vài và xử lý chúng, v.v. Thực tế, đó là một ADC 1 bit, với tất cả các hàm ý như nhiễu lượng tử hóa. Nhưng bạn nên có được ý tưởng chung.
Các SoC hiện đại sử dụng cái gọi là PLL để tạo (gần như) bất kỳ đồng hồ nào có thể cần thiết cho các giao diện. Nói một cách đơn giản, mạch PLL sử dụng VCO tần số cao (Bộ tạo dao động điều khiển bằng điện áp), sau đó sử dụng các bộ chia tần số khác nhau trên cả VCO và đồng hồ đầu vào và tạo ra phản hồi điện áp dựa trên tỷ số tần số. Phản hồi này điều khiển VCO, sao cho toàn bộ vòng lặp được khóa với tần số mong muốn.
Giả sử một byte 8 bit được đặt trước bởi một bit start duy nhất và theo sau là một bit stop duy nhất và giả sử lấy mẫu hoàn hảo bởi người nhận có nghĩa là sau 9,5 bit, đồng hồ phải tắt ít hơn nửa bit.
Điều đó có nghĩa là chênh lệch đồng hồ chấp nhận tối đa giữa máy phát và máy thu là khoảng 5%. Tuy nhiên, có thể có lỗi ở cả hai đầu của liên kết và đồng bộ hóa máy thu có thể không hoàn hảo. Do đó, trong thực tế, tôi thường khuyên rằng tốc độ truyền thực tế được giữ trong phạm vi 1% của tốc độ truyền danh nghĩa.
Các bộ vi điều khiển mà tôi quen thuộc nhất là các thiết bị PIC18. Các mô hình cũ hơn sử dụng bộ đếm 8 bit linh hoạt để chia tỷ lệ baudrate trong khi các mô hình mới hơn có bộ đếm 16 bit linh hoạt. Ngoài ra còn có các chế độ tốc độ "cao" và "thấp" tùy chọn thay đổi tốc độ baudrate theo hệ số bốn.
Với đồng hồ đầu vào 20 MHz, phiên bản 8 bit của sơ đồ thế hệ này là đủ để đạt được trong vòng 0,25% tốc độ truyền danh nghĩa cho tất cả các tỷ lệ từ 1800 đến 19200. Phiên bản 16 bit cho phép bạn xuống tốc độ thấp hơn.
http://www.nicksoft.info/el/calc/?ac=spbrg&submit=1&mcu=+Generic+16bit+BRG&Fosc=20&FoscMul=1000000&FoscAutoSelector=0&MaxBaudRateEr = chế độ đồng bộ)
PLL, bộ chia phân đoạn, vv không thực sự cần thiết cho nối tiếp UART.
Để trao đổi dữ liệu nối tiếp, bộ điều khiển phải xuất hoặc lấy mẫu dữ liệu trong một cửa sổ nhất định của thời gian "lý tưởng". Mặc dù đơn giản nhất là có bộ điều khiển chia đồng hồ cho một yếu tố lập trình và sau đó lại là một yếu tố mã hóa bổ sung, không có yêu cầu nào rằng các bit được đọc hoặc ghi ở các khoảng bằng nhau. Nếu đầu xa của kết nối xuất ra các bit theo các khoảng đồng nhất chính xác khớp với tốc độ baud, thì máy thu có thể nhận được với bất kỳ tốc độ lấy mẫu nào lớn hơn hai lần tốc độ baud cung cấp cho nó mọi thứ vào đúng thời điểm. Ví dụ: giả sử dữ liệu là đầu ra ở mức 19.200 và một dữ liệu được lấy mẫu ở mức chính xác 48.000Hz (2.5x).
Khi nhìn thấy một cạnh rơi xuống, người ta sẽ biết rằng bit stop đã bắt đầu từ 0 đến 1 lần lấy mẫu trước đây. Nếu một nhãn ghi mẫu đầu tiên trong đó bit start được quan sát là thời gian 0, bit 0 sẽ bắt đầu ở đâu đó trong khoảng thời gian 1.5 đến 2.5; bit 1 sẽ bắt đầu ở đâu đó giữa thời gian 4.0 và 5.0, bit 2 sẽ bắt đầu ở đâu đó giữa thời gian 6.5 và 7.5 và bit 3 sẽ bắt đầu ở đâu đó trong khoảng thời gian 9.0 đến 10.0. Do đó, một mẫu được lấy tại thời điểm 3 sẽ được đảm bảo để bắt bit 0 [bắt đầu giữa thời gian 1.5 và 2.5 và kết thúc giữa thời gian 4.0 và 5.0]. Tương tự, một mẫu được lấy tại thời điểm 6 sẽ bắt được bit 1 và một mẫu được lấy tại thời điểm 8, 11, 13, 16, 18 và 20 sẽ bắt được các bit 2-7.
Sử dụng tốc độ mẫu nhanh hơn sẽ làm cho máy thu chịu được sự không hoàn hảo trong nguồn, nhưng ngay cả với tốc độ mẫu chỉ bằng 2,5 lần tốc độ bit, tỷ suất lợi nhuận không quá tệ [khoảng 1/5 thời gian một chút].