PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : Spi نرم افزاری در کدویژن



ali2914
10-09-2010, 18:18
ا سلام
من spi را به صورت سخت افزاری در کد ویژن راه اندازی کردم و 2 تا میکرو را به هم متصل کردم . اما حالا می خوام spi را نرم افزاری کانفیگ کنم . کسی می تونه منو راهنمایی کنه؟

Division
11-09-2010, 01:03
سلام

براي استفاده از اينترفيس spi تو كدويژن يه تابع كتابخونه اي پيش بيني شده كه اسمش spi.h هستش .


#include <spi.h>

تنها تابع كاربردي تو اين كتابخونه تابع زير هستش :


unsigned char spi (unsigned char data)

فرمت كلي استفاده از اين تابع هم تو دستور بالا براتون آوردم و همون طور كه مطلع هستيد اينترفيس spi يه پروتكل full duplex هستش و ميتونه ارتباط دو طرفه همزمان برقرار كنه كه اين مسئله و نحوه استفاده ازش تو قرمت تابع ذكر شده كاملاً مشهوده ...

مقدار بازگشتي تابع بالا = ديتاي دريافتي
مقدار وردي = ديتاي ارسالي

فقط ميمونه كانفيگ رجيستري هاي كنترلي واحد spi كه اينم بستگي به نوع و ويژگي هاي پروژه تون داره .

ali2914
11-09-2010, 10:40
سلام
ممنون اما همونطور که گفتم من به صورت سخت افزاری SPI را راه اندازی کردم. در بسکام شما می تونید از هر پورتی که بخواهید از طریق SPI متصل بشین و کافیه یه سری تنظیمات نرم افزاری انجام بدین . در Codevision این قابلیت وجود داره؟ مثلا من 3 تا Device دارم که از SPI به میکرو وصل می شن . چطوری می تونم از طریق 9 پین متفاوت این Device ها را از طریق نرم افزاری متصل کنم؟در تابع SPI() من هیچ قابلیتی که بشه از پین خاصی به جر پین های سخت افزاری مخصوص SPI را برقرار کرد ندیدم. آیا راهی وجود داره یا اینکه مجبورم روی باس سخت افزاری SPI همه را متصل کنم و با بالا و پایین بردن SS اسلیوها را انتخاب کنم؟

ali2914
11-09-2010, 19:39
سلام
ممنون اما همونطور که گفتم من به صورت سخت افزاری spi را راه اندازی کردم. در بسکام شما می تونید از هر پورتی که بخواهید از طریق spi متصل بشین و کافیه یه سری تنظیمات نرم افزاری انجام بدین . در codevision این قابلیت وجود داره؟ مثلا من 3 تا device دارم که از spi به میکرو وصل می شن . چطوری می تونم از طریق 9 پین متفاوت این device ها را از طریق نرم افزاری متصل کنم؟در تابع spi() من هیچ قابلیتی که بشه از پین خاصی به جر پین های سخت افزاری مخصوص spi را برقرار کرد ندیدم. آیا راهی وجود داره یا اینکه مجبورم روی باس سخت افزاری spi همه را متصل کنم و با بالا و پایین بردن ss اسلیوها را انتخاب کنم؟
بررسی کردم ظاهرا کدویژن چنین قابلیتی نداره!

saeidhp
07-05-2012, 15:27
با سلام

من میخوام توی کدویژن از یه آی سی با پروتکل spi دیتا بخونم

اگه ممکنه یه نمونه کد بزارید تا به صورت عملی ببینم چطور میشه دیتا گرفت

ممنون

saeidhp
07-05-2012, 15:53
من یه کد پیدا کردم که توی کدویژن کار میکنه فقط یه خطا داره که ممنون میشم اگه دوستان یه نگاه بندازن و مشکلو برطرف کنن




#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;
}

saeidhp
08-05-2012, 07:25
دوستان اگه ممکنه یه راهنمایی بفرمایید

فقط یه کپی توی کدویژن بکنید ببینید مشکل از کجاست

با تشکر

saeidhp
13-05-2012, 07:26
سلام
من کاراکتر R توسط SPI در کدویژن میفرستم و توی پروتئوس به درستی دریافت میکنم حالا میخوام حرف بعدی رو بفرستم باید چطوری استفاده کنم



data_send='R';
data_get=spi(data_send);

مثلا میخوام کد R0D4 رو بفرستم

hamidam
13-05-2012, 09:08
سلام
من کاراکتر R توسط SPI در کدویژن میفرستم و توی پروتئوس به درستی دریافت میکنم حالا میخوام حرف بعدی رو بفرستم باید چطوری استفاده کنم



data_send='R';
data_get=spi(data_send);
مثلا میخوام کد R0D4 رو بفرستم

سلام
کمی برنامه ات اشکال دارد.

تک تک کاراکتر ها را با spi بفرست . موقع ذخیره هم در یک آرایه ذخیره کن.



spi('R');
spi('0');
...
....
خط اول کد R را میفرستد
خط دوم کد 0 را می فرستد

در میکروی دریافت کننده



data_get[1]=spi();
data_get[2]=spi();
...
....
خط اول دیتا را از spi دریافت و در [data_get[1 ذخیره میکند.
خط دوم دیتا را از spi دریافت و در [data_get[2 ذخیره میکند.

saeidhp
13-05-2012, 12:38
ممنون از شما به خاطر جواب
اما بازهم نشد من اینکارو به صورت دستی هم انجام داده بودم (به جای آرایه) اما بازهم فقط مقدار آخرین رشته ارسالی رو به صورت درست محاسبه میکنه و بقیه رو اشتباه میزنه

فایل پروتئوس و کدویژن رو میزارم به همراه عکس مربوطه لطفا یه نگاه بندازید

naatamam
13-05-2012, 14:07
من این برنامت را دیدم
در برنامه برای spi باید یک بار برای master برنامه بنویسی و یک بار هم برای salve
من به شبیه سازی پروتئوس کاری ندارم ولی شما یک دیتا را با spi فرستادی درست ولی باز دیتا را دریافت کردی در همان برنامه در حالی که spi را بظاهر mastet تعریف کردی.
برنامه تان درست است اما در صورتی spi دیتا دریافت میکند که از میکروی دیگری دیتا رسیده باشد.

در ضمن به شکل زیر دقت کن چند جا تنظیمات اشکال دارد.

saeidhp
13-05-2012, 20:15
من میخوام از یه آی سی دیتا بگیرم

اون رشته ای که نوشته R0d4 آدرس یه رجیستر از اون آی سی هست

الان مشکل من اینه که نمیتونم این عبارت رو بفرستم

در مورد عکسی که گذاشتید من یک میکرو دارم و اونهم مستر تعریف شده

اگه ممکنه در مورد ارسال این رشته راهنمایی بفرمایید

اینکه گفتید باید هم برای Master بنویسم هم برای Slave الان طرز صحیح ارسال چطوری میشه ؟ این طور که نوشتم اشتباهه؟

naatamam
14-05-2012, 01:22
من میخوام از یه آی سی دیتا بگیرم

اون رشته ای که نوشته R0d4 آدرس یه رجیستر از اون آی سی هست

الان مشکل من اینه که نمیتونم این عبارت رو بفرستم

در مورد عکسی که گذاشتید من یک میکرو دارم و اونهم مستر تعریف شده

اگه ممکنه در مورد ارسال این رشته راهنمایی بفرمایید

اینکه گفتید باید هم برای Master بنویسم هم برای Slave الان طرز صحیح ارسال چطوری میشه ؟ این طور که نوشتم اشتباهه؟

سلام

دوست گرامی این آدرس R0d4 درست نیست. ما کد هگزی که اولش R باشد در زبان سی نداریم. شاید منظور 0x0d4 بوده.

شما یک کتاب avr بگیر و بخش spi انرا خوب بخون , همه چی دستگیرت میشه.
در دیتا شیت آی سی مورد نظر شما هم چگونگی ارتباط را حتما" توضیح داده....

saeidhp
14-05-2012, 10:13
سلام
من این مثال دیتاشیت رو براتون پیوست کردم

من هم شک داشتم که باید Hex بفرستم یا همین کد رو

اما وقتی R رو به صورت تنهایی مینویسم توی Spi Debuger که به صورت باینری نشون میده معادل 52Hex میشه که برابر با R هست

saeidhp
14-05-2012, 21:27
دوستانی که میتونن لطفا کمک کنن کارم توی این قسمت گیر کرده

saeidhp
15-05-2012, 19:04
یعنی کسی از اساتید توی کدویژن با spi کار نکرده من خیلی سرچ کردم ولی چیزی که بدردم بخوره ندیدم

ممنون میشم یکی از دوستان راهنمایی کنه cry::

ali7070
13-08-2014, 00:49
سلام.
چه طوری میتونیم یه متن رو بفرستیم؟ با تابع spiکه فقط میشه کاراکتر فرست..