![]() |
Thắc mắc về giao tiếp SPI
Xin chào mọi người,
Em đã có đọc qua tìm hiểu về giao tiếp SPI và em đang viết chương trình để thử đọc và viết vào EEPROM 25LC256 nhờ dsPIC30F2011. Em đã tham khảo tài liệu cũng như code mẫu của microchip, cụ thể là cái này: http://www.microchip.com/stellent/id...pnote=en023868 đã thay đổi một số chỗ sao cho phù hợp với dsPIC của mình. Hiện giờ em có thắc mắc về phần configuration cho thanh ghi SPI1CON của PIC, cụ thể là phần chọn Mode: word hay byte communication. Trong tài liệu của EEPROM, theo em hiểu thì EEPROM sẽ chỉ nhận từng byte một, ("The 25LC256 contains an 8-bit instruction register), như vậy có phải em sẽ phải chọn chế độ giao tiếp byte? Phần em không hiểu hiện giờ là: thanh đệm SPI1BUF của PIC dài 16 bit, khi viết dữ liệu cần chuyển đi cũng là viết 16 bit, như vậy khi giao tiếp theo chế độ 1 byte thì cái byte còn lại nó vứt đi đâu ạ? |
Trích:
http://www.picvietnam.com/forum/showthread.php?t=2481 Thông tin liên quan đến thắc mắc của bạn đã được đề cập trong tutorial đó. Thân, |
Đương nhiên là cấu hình byte rùi bạn.
Code:
#define EE_SSPIF_BIT IFS2bits.SPI2IF |
Em cảm ơn anh Nam, ý anh là đoạn này ạ? Em có đọc qua tutorial này rồi, nhưng em vẫn không hiểu lắm :"> Anh có thể làm ơn giải thích thêm cho em về thao tác truyền dữ liệu sang slave được không ạ?
Trích:
Em xin lỗi nếu em lại đọc sót phần quan trọng :P, nhưng em vẫn không hiểu thao tác truyền dữ liệu. Đoạn trên là nhân dữ liệu từ slave, vậy nếu em muốn gửi dữ liệu, em cần viết vào SPIxBUF, thì vẫn là viết 16 bit phải không ạ? Hay là em phải dùng lệnh mov.b? (Em đang tập viết bằng hợp ngữ) Em cảm ơn anh nhiều ạ. |
Cảm ơn bạn Serenade, rất tiếc mình đang viết chương trình bằng hợp ngữ, mình lại chưa lập trình bằng C bao giờ cả nên code bạn viết mình không hiểu lắm.
Dù sao cũng rất cảm ơn bạn! |
Bắt đầu viết bằng hợp ngữ thì tốt,nhưng mình khuyên là sau này nên chuyển qua C vì những chương trình lớn viết bằng hợp ngữ không nổi đâu.
|
Mình sẽ nói sơ về giao tiếp spi nhé.Giao tiếp spi sử dụng chung bộ đệm truyền nhận dữ liệu,một đầu dữ liệu đẩy ra ngoài thì đồng thời đầu còn lại của bộ đệm được đưa dữ liệu vào.do đó bạn muốn nhận dữ liệu từ slave (eeprom) thì phải gửi một byte bất kỳ,còn muốn truyền dữ liệu đi thì trước hết phải đọc 1 byte dump trong vùng đệm trước khi truyền để tránh trường hợp tràn vùng đệm nhận vì bạn truyền 1 byte đi đồng nghĩ với việc bạn nhận một byte từ slave.
|
Trích:
Bạn ghi bao nhiêu bit vào SPIxBUF thì cũng chỉ có 8 bit thấp nhất được gửi sang slave khi chọn MODE16 = 0, và cũng chỉ có 8 bit thấp nhất là dữ liệu thực sự nhận được từ slave trong trường hợp này. Không nhất thiết phải dùng lệnh mov.b để lọc 8 bit dữ liệu nhận được từ slave, nhưng đó là một cách tốt. Thân, |
Cảm ơn mọi người đã giúp mình trả lời những câu hỏi trên. Hic hic đây là code mình viết, mình dùng UART để kiểm tra xem việc đọc/viết dữ liệu nhưng vẫn không thành công.
Mình trước đó đã có một code riêng để kiểm tra UART, nên mình khá chắc chắn vấn đề nằm ở cái SPI này... Các cao thủ có thể nhìn qua code này rồi giúp em được không ạ? Cảm ơn mọi người nhiều nhiều! Code:
;Instruction shortcuts: |
Update:
Hôm nay em đã kiểm tra mạch bằng máy đo dao động. Em cho hiện 4 kênh: SCK, CS, SDO và SDI. Các kênh SCK, CS và SDO của PIC hoạt động đúng như em dự định, em có thấy các lệnh viết, đọc được dịch ra chân SDO một cách hợp lý. Tuy nhiên riêng kênh SDI thì luôn luôn 0. Điều này làm em nghĩ vấn đề nằm ở đoạn nhận lại dữ liệu từ EEPROM... Mọi người có thể đọc qua code post ở phía trên của em rồi góp ý được không ạ? Cảm ơn mọi người nhiều nhiều! |
Trích:
Thân, |
Múi giờ GMT. Hiện tại là 05:05 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam