Làm cách nào V-USB có thể làm hỏng SPI tích hợp của ATmega328p?


14

Tôi đang làm việc trên một dự án V-USB hiển thị dưới dạng Bàn phím sử dụng ATmega328p. Phần USB hoạt động rất tốt (đó không phải là dự án V-USB đầu tiên của tôi), nhưng sau khi tôi khởi động ngăn xếp V-USB usbInit(), tất cả các cuộc gọi đến thư viện thẻ SD đều thất bại. Nếu tôi gọi các chức năng tương tự trước đây usbInit(), mọi thứ hoạt động hoàn hảo.

Tôi sử dụng một bản sao Arduino được gọi là Diavolino, nhưng không có khung Arduino / dây. Tôi có USB được kết nối với I / O 2 và 3 kỹ thuật số và thẻ SD thành 10-13 (dòng SPI tích hợp).

Tôi đã xem qua thư viện thẻ SD và không tìm thấy dấu hiệu nào của nó bằng cách sử dụng bất kỳ ngắt hoặc đăng ký nào khác ngoài SPxx. Tôi cũng grepmặc dù mã V-USB, nhưng nó thậm chí không chạm vào các SPxxthanh ghi.

Dấu hiệu đầu tiên của sự cố là khi thiết bị bị ngắt kết nối khi cần thiết phải truy cập thẻ SD. Sau đó, tôi đặt usbPoll()wdt_reset()gọi vào tất cả các vòng xử lý thẻ SD và thấy rằng trong trường hợp viết, thẻ sẽ đợi mãi để nhận được thẻ sau khi đã gửi hai byte cuối (CRC-16).

Thư viện thẻ SD tôi sử dụng là sd_rawcủa Roland Riegel.


2
Theo hiểu biết của tôi thì V-USB rất tốn CPU và có lẽ nó gây ra sự chậm trễ không thể chấp nhận được trong các thói quen SPI. Thông thường, các hoạt động SPI không nhạy cảm với thời gian, nhưng chắc chắn các thao tác ghi và xóa trên SPI FLASH là chắc chắn.
Dave Tweed

Vấn đề là hầu hết các hoạt động đọc không hoạt động hầu hết thời gian và như tôi đã đọc, các SPI comms được thực hiện độc lập ngay khi các thanh ghi dữ liệu và điều khiển được đặt bởi mã đang chạy.
dnet

@DaveTweed - Thời gian nhạy cảm về việc phải chờ thẻ có, nhưng về mặt không thể giữ thẻ chờ chương trình của bạn ??
Chris Stratton

2
Có khả năng bạn đang chờ đợi điều gì đó không thể xảy ra hoặc không thể được phát hiện; ví dụ, chân I / O có thể đã được định cấu hình lại và không còn là đầu vào, hoặc dữ liệu / đồng hồ giả có thể được gửi đến thẻ, đưa nó vào trạng thái không mong muốn. Ngoài ra, hãy đảm bảo rằng cơ chế mà thư viện SD thực hiện các độ trễ cần thiết đã không bị phá vỡ hoặc tăng tốc.
Chris Stratton

3
Bạn cũng có thể có vấn đề về tiếng ồn hoặc nguồn điện. Kiểm tra đường ray của bạn với một phạm vi và kiểm tra các đường SD bằng máy phân tích logic để xem điều gì đang xảy ra.
Jim Paris

Câu trả lời:


1

Tôi đã gặp vấn đề như vậy với USART và giải quyết nó bằng cách thay đổi cài đặt chó canh gác. Như bạn đã biết V-USB sử dụng chó đồng hồ và nếu bạn đặt thêm thời gian trong một thao tác, chó đồng hồ sẽ được kích hoạt. Hãy thử tắt con chó canh gác và nếu bạn thấy mọi thứ đều ổn, bạn có thể thay đổi thời gian của con chó đồng hồ hoặc bạn có thể chia mã can thiệp (mã thẻ SD trong trường hợp của bạn) thành các phần nhỏ hơn và "Đặt lại" con chó đồng hồ giữa chúng. Nhưng đừng quên kích hoạt lại con chó đồng hồ của bạn sau khi gỡ lỗi vì không nên sử dụng V-USB mà không có điều đó.


Lưu ý rằng câu hỏi đề cập đến việc có các lệnh gọi wdt_reset () được chèn vào mã SD; mặc dù tất nhiên có thể điều này không được thực hiện ở mọi nơi.
Chris Stratton

1
Có nhưng nó thực sự đáng để thử mã với việc vô hiệu hóa chó đồng hồ. Đôi khi đặc biệt là khi các dữ liệu trở lại được xử lý trong một thói quen ngắt, mã bị mắc kẹt ở đó và con chó đồng hồ được kích hoạt trước khi reset
Tháng Tám
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.