سلام
بنده یه برنامه واسه spi نوشتم خیلی خوب جواب میده از 1768 اطلاعات میره به مگا 16 رو ال ای دی نمایش میده
وقتی ss مگا مستقیم به زمین مدار هست کار میکنه اما وقتی میخوام ss مگا رو بدم به 1768 (پایه های p0.0-7 و p1.0 -1 رو امتحان کردم) به طرز عجیبی بازی در میاره و مگا هیچی نمیگیره . اصولا IO نباید دخالتی تو کار perphial ها داشته باشه
بردی که روش کار میکنم rev.c اموزشی eca هست . البته بنده مشکلی که تداخل ایجاد کنه بین این تو شماتیک ندیدم
این کد رو ببینید:
توی این کد وقتی میخوام 0x11 رو مگا 16 ببینیم میام اول پایه رو 0 میکنم که اس اس مگا 0 بشه اطلاعات رو میفرستم بعد یه delay و پایه 1 میشه اما مگا هیچی نمیگیره و نمایش نمیده جالب اینکه وقتی FIOSET رو پاک میکنم (خطی که به رنگ قرمز هست) مگا 16 اطلاعات رو میگیریه این در حالیه که وقتی set میشه پایه 1 دیگه کار ارسال اطلاعات به طور کامل تموم شده و اصلا 1 شدنش فقط جلو نویز رو میگیره . اصلا بی معنی به نطر میاد
اصلا یه چیزه عجیبیه هر چی دیلی پشتش میزارم فاصله میدم هر کاری میکنم اگر FIOSET داشته باشم جواب نمیده حتی اگر fioset پنچ دقیقه دیلی بین تابع سند داشته باشه همین مشکل عینن تو حلقه for هم هست
تو حلقه for هم اگه fioset أداشته باشم کار نمیکنه مگا هیچی نمیگیره اما fioset که پاک میکنم درست میشه همه 254تا کاراکتر رو نمایش میده روال ای دی
اصولا نباید این طوری میشد با همین روش nrf w5100 و .... تو avr راه انداختم اما الان به طرز عجیبی این داره اذیت میکنه
کسی میدونه مشکل ممکنه از کجا باشه؟
بنده یه برنامه واسه spi نوشتم خیلی خوب جواب میده از 1768 اطلاعات میره به مگا 16 رو ال ای دی نمایش میده
وقتی ss مگا مستقیم به زمین مدار هست کار میکنه اما وقتی میخوام ss مگا رو بدم به 1768 (پایه های p0.0-7 و p1.0 -1 رو امتحان کردم) به طرز عجیبی بازی در میاره و مگا هیچی نمیگیره . اصولا IO نباید دخالتی تو کار perphial ها داشته باشه
بردی که روش کار میکنم rev.c اموزشی eca هست . البته بنده مشکلی که تداخل ایجاد کنه بین این تو شماتیک ندیدم
این کد رو ببینید:
کد:
#include <lpc17xx.h> #include "_USART.h" void _SPI_INIT (void); char _SPI_SEND (char data); void delay(void) { int p; for(p=0;p<=99999000;p++); } int main (void) { int e; LPC_GPIO2->FIODIR|=0xFF; LPC_GPIO2->FIOSET|=0xFF; LPC_PINCON->PINMODE4|=(1<<1); //LPC_PINCON->PINMODE_OD2|=(1<<0); _SPI_INIT(); LPC_GPIO2->FIOCLR|=0xFF; _SPI_SEND(0x11); delay(); [COLOR=#ff0000]LPC_GPIO2->FIOSET|=0xFF;[/COLOR] while(1) { for(e=0;e<=254;e++) { delay(); LPC_GPIO2->FIOCLR|=0xFF; delay(); _SPI_SEND(e); delay(); delay(); delay(); delay(); [COLOR=#ff0000]LPC_GPIO2->FIOSET|=0xFF;[/COLOR] delay(); } } } void _SPI_INIT (void) { LPC_SC->PCONP|=(1<<8); LPC_SC->PCLKSEL0|=((1<<16)|(1<<17)); LPC_PINCON->PINSEL0|=((1<<31)|(1<<30)); LPC_PINCON->PINSEL1|=((1<<2)|(1<<3)|(1<<4)|(1<<5)); LPC_SPI->SPCR=0x000020; LPC_SPI->SPCCR=18; } char _SPI_SEND (char data) { LPC_SPI->SPDR=data; while(!(LPC_SPI->SPSR & 0x80)); return LPC_SPI->SPDR; }
اصلا یه چیزه عجیبیه هر چی دیلی پشتش میزارم فاصله میدم هر کاری میکنم اگر FIOSET داشته باشم جواب نمیده حتی اگر fioset پنچ دقیقه دیلی بین تابع سند داشته باشه همین مشکل عینن تو حلقه for هم هست
تو حلقه for هم اگه fioset أداشته باشم کار نمیکنه مگا هیچی نمیگیره اما fioset که پاک میکنم درست میشه همه 254تا کاراکتر رو نمایش میده روال ای دی
اصولا نباید این طوری میشد با همین روش nrf w5100 و .... تو avr راه انداختم اما الان به طرز عجیبی این داره اذیت میکنه
کسی میدونه مشکل ممکنه از کجا باشه؟
دیدگاه