ا سلام
من spi را به صورت سخت افزاری در کد ویژن راه اندازی کردم و 2 تا میکرو را به هم متصل کردم . اما حالا می خوام spi را نرم افزاری کانفیگ کنم . کسی می تونه منو راهنمایی کنه؟
نمایش نسخه قابل چاپ
ا سلام
من spi را به صورت سخت افزاری در کد ویژن راه اندازی کردم و 2 تا میکرو را به هم متصل کردم . اما حالا می خوام spi را نرم افزاری کانفیگ کنم . کسی می تونه منو راهنمایی کنه؟
سلام
براي استفاده از اينترفيس spi تو كدويژن يه تابع كتابخونه اي پيش بيني شده كه اسمش spi.h هستش .
تنها تابع كاربردي تو اين كتابخونه تابع زير هستش :کد:#include <spi.h>
فرمت كلي استفاده از اين تابع هم تو دستور بالا براتون آوردم و همون طور كه مطلع هستيد اينترفيس spi يه پروتكل full duplex هستش و ميتونه ارتباط دو طرفه همزمان برقرار كنه كه اين مسئله و نحوه استفاده ازش تو قرمت تابع ذكر شده كاملاً مشهوده ...کد:unsigned char spi (unsigned char data)
مقدار بازگشتي تابع بالا = ديتاي دريافتي
مقدار وردي = ديتاي ارسالي
فقط ميمونه كانفيگ رجيستري هاي كنترلي واحد spi كه اينم بستگي به نوع و ويژگي هاي پروژه تون داره .
سلام
ممنون اما همونطور که گفتم من به صورت سخت افزاری SPI را راه اندازی کردم. در بسکام شما می تونید از هر پورتی که بخواهید از طریق SPI متصل بشین و کافیه یه سری تنظیمات نرم افزاری انجام بدین . در Codevision این قابلیت وجود داره؟ مثلا من 3 تا Device دارم که از SPI به میکرو وصل می شن . چطوری می تونم از طریق 9 پین متفاوت این Device ها را از طریق نرم افزاری متصل کنم؟در تابع SPI() من هیچ قابلیتی که بشه از پین خاصی به جر پین های سخت افزاری مخصوص SPI را برقرار کرد ندیدم. آیا راهی وجود داره یا اینکه مجبورم روی باس سخت افزاری SPI همه را متصل کنم و با بالا و پایین بردن SS اسلیوها را انتخاب کنم؟
بررسی کردم ظاهرا کدویژن چنین قابلیتی نداره!نقل قول:
با سلام
من میخوام توی کدویژن از یه آی سی با پروتکل spi دیتا بخونم
اگه ممکنه یه نمونه کد بزارید تا به صورت عملی ببینم چطور میشه دیتا گرفت
ممنون
من یه کد پیدا کردم که توی کدویژن کار میکنه فقط یه خطا داره که ممنون میشم اگه دوستان یه نگاه بندازن و مشکلو برطرف کنن
کد:
#include <mega16.h>
#include <stdio.h>
#include <stdlib.h>
#include <delay.h>
#include <string.h>
#include <math.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
// Standard Input/Output functions
#include <stdio.h>
// SPI functions
#include <spi.h>
// Declare your global variables here
int Temp ;
char LCD_txt[16];//Buffer for LCD to display text
char Display_LCD[16];//Buffer to display on the LCD
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=Out Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xB0;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 1000.000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x00;
// LCD module initialization
lcd_init(16);
while (1)
{
ftoa(Temp,2,Display_LCD);
sprintf(LCD_txt,"Power = %s",Display_LCD);
lcd_gotoxy(0,0);
lcd_puts(LCD_txt);
delay_ms(1000);
lcd_clear();
};
}
void USART_Init( unsigned int baud )
{
UBRRH = (unsigned char)(baud>>8); // set baud rate
UBRRL = (unsigned char)baud; // enable receive
UCSRC = (1<<URSEL)|(3<<UCSZ0); // set frame format
}
void USART_Transmit( unsigned char data )
{
while ( !( UCSRA & (1<<5)) ); // Wait for empty transmit buffer
UDR = DATA; // Put data into buffer, sends the data
}
void SPI_MasterInit(void)
{
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK); //Set MOSI and SCK output, all others input
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //Enable SPI, Master, set clock rate fck/16
}
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}
دوستان اگه ممکنه یه راهنمایی بفرمایید
فقط یه کپی توی کدویژن بکنید ببینید مشکل از کجاست
با تشکر
سلام
من کاراکتر R توسط SPI در کدویژن میفرستم و توی پروتئوس به درستی دریافت میکنم حالا میخوام حرف بعدی رو بفرستم باید چطوری استفاده کنم
مثلا میخوام کد R0D4 رو بفرستمکد:data_send='R';
data_get=spi(data_send);
سلامنقل قول:
کمی برنامه ات اشکال دارد.
تک تک کاراکتر ها را با spi بفرست . موقع ذخیره هم در یک آرایه ذخیره کن.
خط اول کد R را میفرستدکد:spi('R');
spi('0');
...
....
خط دوم کد 0 را می فرستد
در میکروی دریافت کننده
خط اول دیتا را از spi دریافت و در [data_get[1 ذخیره میکند.کد:data_get[1]=spi();
data_get[2]=spi();
...
....
خط دوم دیتا را از spi دریافت و در [data_get[2 ذخیره میکند.
ممنون از شما به خاطر جواب
اما بازهم نشد من اینکارو به صورت دستی هم انجام داده بودم (به جای آرایه) اما بازهم فقط مقدار آخرین رشته ارسالی رو به صورت درست محاسبه میکنه و بقیه رو اشتباه میزنه
فایل پروتئوس و کدویژن رو میزارم به همراه عکس مربوطه لطفا یه نگاه بندازید
من این برنامت را دیدم
در برنامه برای spi باید یک بار برای master برنامه بنویسی و یک بار هم برای salve
من به شبیه سازی پروتئوس کاری ندارم ولی شما یک دیتا را با spi فرستادی درست ولی باز دیتا را دریافت کردی در همان برنامه در حالی که spi را بظاهر mastet تعریف کردی.
برنامه تان درست است اما در صورتی spi دیتا دریافت میکند که از میکروی دیگری دیتا رسیده باشد.
در ضمن به شکل زیر دقت کن چند جا تنظیمات اشکال دارد.
من میخوام از یه آی سی دیتا بگیرم
اون رشته ای که نوشته R0d4 آدرس یه رجیستر از اون آی سی هست
الان مشکل من اینه که نمیتونم این عبارت رو بفرستم
در مورد عکسی که گذاشتید من یک میکرو دارم و اونهم مستر تعریف شده
اگه ممکنه در مورد ارسال این رشته راهنمایی بفرمایید
اینکه گفتید باید هم برای Master بنویسم هم برای Slave الان طرز صحیح ارسال چطوری میشه ؟ این طور که نوشتم اشتباهه؟
سلامنقل قول:
دوست گرامی این آدرس R0d4 درست نیست. ما کد هگزی که اولش R باشد در زبان سی نداریم. شاید منظور 0x0d4 بوده.
شما یک کتاب avr بگیر و بخش spi انرا خوب بخون , همه چی دستگیرت میشه.
در دیتا شیت آی سی مورد نظر شما هم چگونگی ارتباط را حتما" توضیح داده....
سلام
من این مثال دیتاشیت رو براتون پیوست کردم
من هم شک داشتم که باید Hex بفرستم یا همین کد رو
اما وقتی R رو به صورت تنهایی مینویسم توی Spi Debuger که به صورت باینری نشون میده معادل 52Hex میشه که برابر با R هست
دوستانی که میتونن لطفا کمک کنن کارم توی این قسمت گیر کرده
یعنی کسی از اساتید توی کدویژن با spi کار نکرده من خیلی سرچ کردم ولی چیزی که بدردم بخوره ندیدم
ممنون میشم یکی از دوستان راهنمایی کنه cry::
سلام.
چه طوری میتونیم یه متن رو بفرستیم؟ با تابع spiکه فقط میشه کاراکتر فرست..