שְׁאֵלָה:
מכשיר SPI מרובה
eszik.k
2017-08-16 03:15:11 UTC
view on stackexchange narkive permalink

אני רוצה לחבר לוח אתרנט (W5100 HR911105A) ל Arduino Leonardo עם SPI ואני רוצה לחבר קורא SD.כאשר אני בודק את הלוחות האלה בנפרד הכל עובד. אבל כשאני מחבר אותם לאותו לוח התוכנית נכשלת ב Ethernet.begin();

  #include <SPI.h> # include <Ethernet.h> # include <S. h> # define SS_SD_CARD 4 # define SS_ETHERNET 10const char CONFIG_FILE [] = "system.cfg"; בית C_MAC [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress S_IP (192,168,0, IP C_IP (192, 168, 0, 177); const uint16_t S_PORT = 8090; לקוח EthernetClient; הגדרת חלל () {Serial.begin (9600); בעוד (! סדרתי) {; // המתן לחיבור היציאה הטורית. דרוש ליציאת USB מקורית בלבד} pinMode (SS_SD_CARD, OUTPUT); pinMode (SS_ETHERNET, OUTPUT); digitalWrite (SS_SD_CARD, HIGH); digitalWrite (SS_ETHERNET, HIGH); digitalWrite (SS_SD_CARD, LOW); SD.begin (SS_SD_CARD); digitalWrite (SS_SD_CARD, HIGH); Serial.println ("הגדרת אתר"); digitalWrite (SS_ETHERNET, LOW); אם (Ethernet.begin (C_MAC) == 0) {Serial.println ("נכשלה הגדרת התצורה של Ethernet באמצעות DHCP"); Ethernet.begin (C_MAC, C_IP); } עיכוב (100); Serial.println ("התחברות ..."); תוצאת bool = client.connect (S_IP, S_PORT); Serial.println ("מחובר"); digitalWrite (SS_ETHERNET, HIGH);} loop loop () {Serial.println ("loop ..."); עיכוב (1000);}  

ניסיתי את לאונרדו ומגה 2560.

אז אתה אומר שאם יש לך רק את W5100 מחובר לליאונרדו זה עובד בסדר אבל ברגע שאתה מחבר את קורא ה- SD זה לא עובד? כמו כן, זה SPI, לא ספק שירותי אינטרנט. ספק שירותי האינטרנט מייצג מתכנת בתוך המערכת, וזה משהו אחר לגמרי.
כן זה מה שאני אומר. כאשר אני מחבר את שני המכשירים ל- SPI רק קורא הכרטיסים עובד וקורא נתונים מהכרטיס, והאתרנט נכשל בנקודה המוזכרת. אבל אם אני רק מחבר את ה- Ethernet זה עובד.
כאשר אתה בודק בנפרד כפי שאתה מתאר, האם מספרים של סיכות ה- SS זהים (4 ו -10)?
באיזה קורא SD אתה משתמש? אתה יכול לתאר את החיווט המדויק?
שְׁלוֹשָׁה תשובות:
next-hack
2017-08-22 14:50:01 UTC
view on stackexchange narkive permalink

יש קוראי כרטיסים מסוימים (כמו גם לוחות תצוגה עם שקע SD מובנה) המשתמשים בנגדי 10-kOhm בסדרה לקווי CS, DIN ו- CLK, כדי לבצע תרגום זול ברמה של 5 וולט ל -3.3 וולט. זה ממש לא הפיתרון הטוב ביותר, במיוחד מבחינת מהירות (וידאנו שבדרך כלל זה מגביל את מהירות ה- SPI המרבית לכ -1 מגה-הרץ).

קוראי כרטיסים אחרים (כמו זה http: //modtronix.com/mod-sdcard-l5.html), פשוט השתמשו בנגדי 10 k-Ohm כמשוך עד 3.3V. לכן אתה מחבר את כל קווי כרטיס ה- SD ללוח לאונרדו, שהוא ברמה של 5 וולט. זה יגרום לבעיות חמורות בכרטיס SD או בלוח ליאונרדו. אם קורא הכרטיסים שלך נופל במקרה השני הזה, אני מציע לך להכניס מחלק נגדים (1k + 1.5k) בסדרה לכל שורות קלט בכרטיס SD: DIN, CLK, CS. בתרשימים הבאים אני פשוט מראה לקו CLK, כמובן שאתה צריך לחזור על זה שלוש פעמים. רעיון טוב בהרבה יהיה מתרגם ברמה IC.

schematic

לדמות את המעגל הזה - סכמטי שנוצר באמצעות CircuitLab

Michel Keijzers
2017-08-16 03:22:11 UTC
view on stackexchange narkive permalink

אם יש לך קורא כרטיסי SD דומה כמו למטה (או אותו אבל עם כרטיס מיקרו SD), מאשר הייתה לי אותה בעיה בדיוק.

זה עובד כמכשיר יחיד ב- SPI, אך לא יחד עם מכשיר SPI אחר.

באפשרותך להשתמש בלוח פרוטו מקליט SD, או להשתמש במיקרו-בקר בעל מספר SPI.

SD breakout

דוגמה למקליט ה- SD בו השתמשתי ועובד עם מכשיר SPI אחר ביציאת SPI אחת.

חסרונות: גדול יותר, יקר יותר Pro: בעל מרחב RTC ופרוטו.

SD Recorder

כן, יש לי קורא כרטיסים דומה כמו שהראית. אני מקווה שיש פיתרון לבעיה זו. http://www.ebay.com/itm/SPI-Reader-Micro-SD-Memory-Card-TF-Memory-Card-Shield-Module-for-Arduino-AD-/112173309871?hash=item1a1e0cdfaf:g:1 -EAAOSwJ7RYT2jV
השתמשתי עד לאחרונה במגן מקליט ה- SD, אבל אני עובר ל- STM32 שיש בו מספר יציאות SPI, כך שאני לא יכול כנראה (בלי לנסות) קורא כרטיסי SD פשוט כמו שאתה צריך ליציאה אחת, וציוד היקפי אחר (כמו RF רדיו) ל- SPI אחר.
@MichelKeijzers - מעולם לא השתמשתי במכשיר SPI (תמיד הייתי ילד I2C) אבל חשבתי שהרעיון הוא שאתה משתמש בהובלת ה- CS כדי לשלוט במה שמקבל את המסר. ממה שאמרת אני מניח שיש בזה יותר מזה.
@CodeGorilla אתה צודק, ה- CS (שבב בחר או SS: עבד בחר) מחליט מי מקבל את ההודעה. בדרך כלל אחד מסיכות ה- CS נמוך והאחרים גבוהים. מכשיר ה- SPI עם סיכה נמוכה של CS יכול לתקשר עם המאסטר. יש לחבר את כל ה- MISOs ו- MOSI, ומכשירים מסוימים (כמו קורא כרטיסי ה- SD הזול) אינם תומכים בכך ... אני לא יודע מה הסיבה.
James Kent
2017-08-24 17:57:42 UTC
view on stackexchange narkive permalink

אני חושד שהסיבה נובעת מאיך שתוכננו הקלטים / פלטים, נראה כי ה- W5100 הוא לוח 3v3 עם כניסות תואמות 5V, וכך גם הקישור שפרסמת לקורא ה- SD, אולם תלוי איך הקלטים / הפלטים הללו שתוכננו יכולים להיות שהם לא "ישחקו יפה" עם לוחות אחרים באותו אוטובוס למרות ש- SPI נועד לעשות זאת.

תלוי איפה הבעיה יש כמה פתרונות פוטנציאליים, אם ( כפי שאני חושד) הבעיה היא הפלט מהמכשירים חזרה לארדואינו (כלומר אתה יכול לכתוב להם אך לא לקרוא מהם) שתוכל לאשר על ידי חיבור כל השורות במקביל, אלא רק חיבור אחד מהקווים הסידוריים חזרה את הארדואינו ובדוק שהוא עובד, ואז החלף את הסידורי למכשיר השני ובדוק את זה. בהנחה ששני המכשירים עובדים בתצורה זו עליך לתקן רק את אות ההחזרה. הדרך הפשוטה ביותר לעשות זאת תהיה להשתמש בשני מאגרי תלת-ממדי.

כך שאות ההחזרה מחובר לארדואינו רק כאשר אותו קו בחר מכשירים פעיל. ועכבה גבוהה (מנותקת) אחרת, ניתוק פרוגרמטי של מכשיר אחד מהאוטובוס.



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...