PDA

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



dizgah
02-09-2014, 23:54
سلام
پیرو زحمتام به بچه های انجمن ، برای پیدا کردن یک برنامه نمونه ساده از راه اندازی spi در stm32f103 و آموزش کاربردی توابع اون در cmsis در کیل 5 بسیار نیازمند یاری سبزتان هستیم
از آموزش های کیل و اس تی پیز خاصی حالیم نشد . یک سمپل راه اندازی ساده و راه اندازی توابع اصلی خواندن و نوشتن بیشتر میتونه کمکم کنه
و اینکه چرا برای استفاده از spi حتما باید سیستم عامل rtx رو اضافه کنیم ؟
نمیشه بدون سیستم عامل ازش استفاده کرد ؟
بی نهایت ممنون
:mrgreen:

sadmonew
03-09-2014, 13:07
سلام مهندس
اینم یه مثال برای راه اندازی spi

dizgah
04-09-2014, 12:20
بسیار ممنون
در مورد دو دستور زیر سوال داشتم

xxx->yy
این دستور کاربردش چیه ؟ کپی محتوی ؟
-------

#define CR_PLLON_Set ((u32)0x01000000)
با دستورات پیش پردازنده آشنام،تو قسمت دوم چرا کد به اون صورت (دو پرانتزی) وارد شده ؟ آیا منظورش اینه که عبارت مورد نظر رو معادل فلان مقدار هگز که 32 بیتیه تعریف کن ؟ اگه نه u32 چی میگه ؟
----------------
هنگام تعریف پروژه و انتخاب قابلیتهاش در ورژن 5 کیل مگه خود کیل کتابخونه های مورد نیاز رو ضمیمه پروژه نمیکنه ؟آیا بازم لازمه ازstm32 standard peripheral library قایلهای مورد نظرو کپی کنیم و قسمتهای مورد استفاده رو تو متن فعال کنیم ؟(با حذف // و خارج کردن از حالت توضیح ؟)
ممنون

sadmonew
04-09-2014, 12:35
سلام
در مورد دستور SPI1->DR که منظورم رجیستر دیتای SPI1 هست. از دستورات CMSIS استفاده نکردم
البته میتونستم از تابع SPI_I2S_ReceiveData که جزو دستورات CMSIS هست استفاده کنم.
---
#define CR_PLLON_Set ((u32)0x01000000) کجا پیدا کردین؟

dizgah
04-09-2014, 12:55
دستور اول همون کار کپی رو انجام میده ؟
دستور دوم :

8039

در مورد بقیه سوالات هم ممنون میشم پاسخ بدین
هم چنین تو کیل تو تب c++ تو قسما دستورات پیش پردازنده متنهایی که اضاقه میکنیم چی کار میکنن؟
مثل :
STM32F429_439xx,USE_STDPERIPH_DRIVER,STM32F4XX,__A SSEMBLY__,KEIL_IDE

avr_1360
05-09-2014, 01:26
اینم یه مثال دیگه از spi2.

sadmonew
05-09-2014, 15:29
اینم یه مثال دیگه از spi2.

سلام
ممنون مهندس ، اما فایلی که گذاشتی مشکل داره لطفا" دوباره قرار بده.

avr_1360
05-09-2014, 16:31
دوباره اپلود کردم.
لطفا ببینین مشکلی نداره.

dizgah
05-09-2014, 23:30
سلام بسیار ممنون
در مورد دستورات زیر میشه راهنماییم کنید ؟

RCC->APB1ENR=RCC_APB1ENR_SPI2EN;
همونطور که قبلن هم پرسیدم کار عملگر
-> چیه ؟
و این دستور چی کار میکنه ؟

#define CR_PLLON_Set ((u32)0x01000000)
موقع ایجاد پروژه تو کیل دو تا هدر برای GPIO قابل انتخاب هستش یکیش فک کنم مال خود cmsis و اون یکی از کتابخونه های std-peripheral lib هستش درسته ؟ این دو تا هر دو مشابهن ؟
آموزشهای بسیاری برای میکروهای nxp هستش ولی متاسفانه برای st آموزشها زیاد نیستش ،اکثرا هم از کتابخونه های شخصی خودشون استفاده میکنن
دوستان آموزشی رو با استفاده از cmsis یا std_peripheral lib دارن که تک تک و بصورت ساده قسمتهای مختلف رو راه اندازی کرده باشه یا آموزشی بصورت ساده یاد بده ؟(فارسی یا انگلیسیش مهم نیس )
خیلی ممنون از بپه های با معرفت

avr_1360
06-09-2014, 04:22
برای فعال کردن هر پریفرال میکرو اول باید کلاک اون فعال شه.
این دستور RCC->APB1ENR=RCC_APB1ENR_SPI2EN برای فعال کردن کلاک spi2 هست.
و اگر بخواهید کلاک پورت b رو فعال کنید از دستور RCC->APB2ENR=RCC_APB2ENR_IOPBEN استفاده میشه.
این روش روش پایه ایه و از هدر خود کیل(stm32f10x.h) استفاده شده و از کتابخونه شخصی استفاده نشده.
اگه این فایلو نگاه کنی این ریجیسترها رو توش میشه دید.

dizgah
09-09-2014, 20:31
با تشکر از همه جواب یکی از سوالامو اینجا پیدا کردم توضیح کامل مولفشو میذارم تا شاید برای یکی دیگه هم سوال باشه :


در مورد آخری هم بگم که همه این رجیستر ها اگر نوشتنی باشن به صورت GPIOB->ODR=0x0001 و اگه خوندنی باشن بصورت i = GPIOB->ODR نوشته میشند. این ظور نیست که هر کدام به یک صورت خاص باشه !
این علامت <- هم که می بینید از علایم استاندارد زبان C هست . چون این رجیستر ها بصورت Structure نوشته شدن . برای دسترسی به Structure هم از این علامت استفاده میکنند . نظیر این علامت <- یا :: رو می تونید تو هر جا مثل برنامه های ویژوال C کامپیوتر ببینید . در مورد مقداردهی به رجیستر هم که بستگی به این که چند بیتی هست 16 یا 32 ... متفاوته . مثلا 0x0283 برای یک رجیستر 16 بیتی هست و 0x1c2304b3 برای یک رجیستر 32 بیتی .
یا حق

dizgah
11-09-2014, 20:07
سلام دوباره خدمت دوستان
بنده با استفاده از کتابخونه ها و مثالهای بچه ها مثال زیر رو برای راه اندازی lcd کاراکتری نوشتم ،این مثال بدون ارور کامپایل میشه ولی متاسفانه بطور عملی کار نمیکنه
آپلود میکنم لطفا اگه ممکنه بررسی کنید و اشتباهم رو بهم بگین
راستی عنوان رو هم ویرایش کردم تا نیازی به تاپیک جدید نباشه
ممنون از همگی
8062
-----------------
main.c


#include "stm32f10x.h"
#include "delay.h"
#include "lcd4bit.h"


int main(void)
{
delay_init(72);
lcd_init();
lcd_cursor_on();
lcd_cursor_blink();
lcd_putsf("MHD");
set_cursor(1,0);
delay_ms(1000);
lcd_putsf("is here");
while(1)
{
}


}






---------------------
lcd4bit.h




#ifndef __lcd4bit_H
#define __lcd4bit_H


// Define LCD-16x2 PinIO Interface Mask Bit
#define LCD_EN_PIN GPIO_Pin_2
#define LCD_EN_PORT GPIOB
#define RCC_APB2Periph_GPIO_EN RCC_APB2Periph_GPIOB


#define LCD_RW_PIN GPIO_Pin_1
#define LCD_RW_PORT GPIOB
#define RCC_APB2Periph_GPIO_RW RCC_APB2Periph_GPIOB


#define LCD_RS_PIN GPIO_Pin_0
#define LCD_RS_PORT GPIOB
#define RCC_APB2Periph_GPIO_RS RCC_APB2Periph_GPIOB


#define LCD_D4_PIN GPIO_Pin_4
#define LCD_D5_PIN GPIO_Pin_5
#define LCD_D6_PIN GPIO_Pin_6
#define LCD_D7_PIN GPIO_Pin_7
#define LCD_DATA_PORT GPIOB
#define RCC_APB2Periph_GPIO_DATA RCC_APB2Periph_GPIOB


#define LCD_EN_HI() GPIO_WriteBit(LCD_EN_PORT,LCD_EN_PIN,Bit_SET)
#define LCD_EN_LO() GPIO_WriteBit(LCD_EN_PORT,LCD_EN_PIN,Bit_RESET)


#define LCD_RW_HI() GPIO_WriteBit(LCD_RW_PORT,LCD_RW_PIN,Bit_SET)
#define LCD_RW_LO() GPIO_WriteBit(LCD_RW_PORT,LCD_RW_PIN,Bit_RESET)


#define LCD_RS_HI() GPIO_WriteBit(LCD_RS_PORT,LCD_RS_PIN,Bit_SET)
#define LCD_RS_LO() GPIO_WriteBit(LCD_RS_PORT,LCD_RS_PIN,Bit_RESET)


#define LCD_D4_HI() GPIO_WriteBit(LCD_DATA_PORT,LCD_D4_PIN,Bit_SET)
#define LCD_D4_LO() GPIO_WriteBit(LCD_DATA_PORT,LCD_D4_PIN,Bit_RESET)


#define LCD_D5_HI() GPIO_WriteBit(LCD_DATA_PORT,LCD_D5_PIN,Bit_SET)
#define LCD_D5_LO() GPIO_WriteBit(LCD_DATA_PORT,LCD_D5_PIN,Bit_RESET)


#define LCD_D6_HI() GPIO_WriteBit(LCD_DATA_PORT,LCD_D6_PIN,Bit_SET)
#define LCD_D6_LO() GPIO_WriteBit(LCD_DATA_PORT,LCD_D6_PIN,Bit_RESET)


#define LCD_D7_HI() GPIO_WriteBit(LCD_DATA_PORT,LCD_D7_PIN,Bit_SET)
#define LCD_D7_LO() GPIO_WriteBit(LCD_DATA_PORT,LCD_D7_PIN,Bit_RESET)


#define lcd_clear() lcd_write_cmd(0x01) // Clear Display
#define lcd_cursor_home() lcd_write_cmd(0x02) // Set Cursor = 0
#define lcd_display_on() lcd_write_cmd(0x0E) // LCD Display Enable
#define lcd_display_off() lcd_write_cmd(0x08) // LCD Display Disable
#define lcd_cursor_blink() lcd_write_cmd(0x0F) // Set Cursor = Blink
#define lcd_cursor_on() lcd_write_cmd(0x0E) // Enable LCD Cursor
#define lcd_cursor_off() lcd_write_cmd(0x0C) // Disable LCD Cursor
#define lcd_cursor_left() lcd_write_cmd(0x10) // Shift Left Cursor
#define lcd_cursor_right() lcd_write_cmd(0x14) // Shift Right Cursor
#define lcd_display_sleft() lcd_write_cmd(0x18) // Shift Left Display
#define lcd_display_sright() lcd_write_cmd(0x1C) // Shift Right Display

/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void lcd_out_data4(unsigned char val);
void lcd_write_byte(unsigned char val);
void lcd_write_cmd(unsigned char val);
void lcd_putchar(unsigned char c);
void lcd_init(void);
void set_cursor(unsigned char column, unsigned char line);
void lcd_putsf(char* str);
void lcd_puts(int num);
char busy_lcd(void);
void enable_lcd(void);
void lcd_bargraph (int value, int size);
void lcd_bargraphXY (int pos_x, int pos_y, int value);


#endif /* __lcd4bit_H */



--------------------
lcd4bit.c


#include "lcd4bit.h"
#include "stm32f10x.h"
#include "delay.h"


#define DELAY_2N 0
GPIO_InitTypeDef GPIO_InitStructure;
void inita (void)
{
delay_init(72);
}
/* 8 user defined characters to be loaded into CGRAM (used for bargraph) */
const char UserFont[8][8] =
{
{ 0x11,0x0A,0x04,0x1B,0x11,0x11,0x11,0x0E },
{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
{ 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 },
{ 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C },
{ 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E },
{ 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
};


/************************************************** ****************************/


/****************************/
/* Strobe 4-Bit Data to LCD */
/****************************/
void lcd_out_data4(unsigned char val)
{
if((val&0x01)==0x01) // Bit[0]
{
LCD_D4_HI();
}
else
{
LCD_D4_LO();
}

if((val&0x02)==0x02) // Bit[1]
{
LCD_D5_HI();
}
else
{
LCD_D5_LO();
}

if((val&0x04)==0x04) // Bit[2]
{
LCD_D6_HI();
}
else
{
LCD_D6_LO();
}

if((val&0x08)==0x08) // Bit[3]
{
LCD_D7_HI();
}
else
{
LCD_D7_LO();
}


}


/****************************/
/* Write Data 1 Byte to LCD */
/****************************/
void lcd_write_byte(unsigned char val)
{
lcd_out_data4((val>>4)&0x0F); // Strobe 4-Bit High-Nibble to LCD
enable_lcd(); // Enable Pulse

lcd_out_data4(val&0x0F); // Strobe 4-Bit Low-Nibble to LCD
enable_lcd(); // Enable Pulse


while(busy_lcd()); // Wait LCD Execute Complete
}


/****************************/
/* Write Instruction to LCD */
/****************************/
void lcd_write_cmd(unsigned char val)
{
LCD_RS_LO(); // RS = 0 = Instruction Select
lcd_write_byte(val); // Strobe Command Byte
}


/****************************/
/* Write Data(ASCII) to LCD */
/****************************/
void lcd_putchar(unsigned char c)
{
LCD_RS_HI(); // RS = 1 = Data Select
lcd_write_byte(c); // Strobe 1 Byte to LCD
}


/*******************************/
/* Initial 4-Bit LCD Interface */
/*******************************/


void lcd_init(void)
{
int i;
char const *p;
/* Configure IO connected to LCD16X2 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_EN, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = LCD_EN_PIN;
GPIO_Init(LCD_EN_PORT, &GPIO_InitStructure);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_RW, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = LCD_RW_PIN;
GPIO_Init(LCD_RW_PORT, &GPIO_InitStructure);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_RS, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = LCD_RS_PIN;
GPIO_Init(LCD_RS_PORT, &GPIO_InitStructure);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DATA, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = LCD_D4_PIN |
LCD_D5_PIN |
LCD_D6_PIN |
LCD_D7_PIN;
GPIO_Init(LCD_DATA_PORT, &GPIO_InitStructure);

delay_init(72);


LCD_D4_HI();
LCD_D5_HI();
LCD_D6_LO();
LCD_D7_LO();
delay_ms(15); // Power-On Delay (15 mS)

LCD_D4_HI();
LCD_D5_HI();
LCD_D6_LO();
LCD_D7_LO();
enable_lcd(); // Enable Pulse
delay_us(4100); // Delay 4.1mS

LCD_D4_HI();
LCD_D5_HI();
LCD_D6_LO();
LCD_D7_LO();
enable_lcd(); // Enable Pulse
delay_us(100); // delay 100uS

LCD_D4_HI();
LCD_D5_HI();
LCD_D6_LO();
LCD_D7_LO();
enable_lcd(); // Enable Pulse
while(busy_lcd()); // Wait LCD Execute Complete

LCD_D4_LO();
LCD_D5_HI();
LCD_D6_LO();
LCD_D7_LO();
enable_lcd(); // Enable Pulse
while(busy_lcd()); // Wait LCD Execute Complete

lcd_write_cmd(0x28); // Function Set (DL=0 4-Bit,N=1 2 Line,F=0 5X7)
lcd_write_cmd(0x0C); // Display on/off Control (Entry Display,Cursor off,Cursor not Blink)
lcd_write_cmd(0x06); // Entry Mode Set (I/D=1 Increment,S=0 Cursor Shift)
//lcd_write_control(0x01); // Clear Display (Clear Display,Set DD RAM Address=0)
//delay(15000); // Wait Command Ready


/* Load user-specific characters into CGRAM */
lcd_write_cmd(0x40); /* Set CGRAM address counter to 0 */
p = &UserFont[0][0];
for (i = 0; i < sizeof(UserFont); i++, p++)
lcd_putchar(*p);


lcd_write_cmd(0x80); /* Set DDRAM address counter to 0 */
}


/************************************************** *****************************
* Set cursor position on LCD display *
* Parameter: column: column position *
* line: line position *
* Return: *
************************************************** *****************************/


void set_cursor(unsigned char line, unsigned char column)
{
unsigned char address;
column--;line--;
address = (line * 40) + column;
address = 0x80 + (address & 0x7F);
lcd_write_cmd(address); /* Set DDRAM address counter to 0 */
}


/************************************/
/* Print Display Data(ASCII) to LCD */
/************************************/
void lcd_putsf(char* str)
{
int i;


for (i=0;i<16 && str[i]!=0;i++) // 16 Character Print
{
lcd_putchar(str[i]); // Print Byte to LCD
}
}


////////////////////////////////////////////////////
void lcd_puts(int num)
{
int i,j;
int p,f=0;
char ch[5];
for(i=0;i<5;i++)
{
p=1;
for(j=4-i;j>0;j--)
p = p*10;
ch[i] = (num/p);
if (num>=p && !f){
f=1;
}
num =num - ch[i] *p ;
ch[i] = ch[i] +48;
if(f) lcd_putchar(ch[i]);
}
}
/////////////////////////////////////////////////////
/******************/
/* Wait LCD Ready */
/******************/


char busy_lcd(void)
{
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Config D7 = Read
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = LCD_D7_PIN;
GPIO_Init(LCD_DATA_PORT, &GPIO_InitStructure);


LCD_RS_LO(); // Instruction Select
LCD_RW_HI(); // Read Direction
LCD_EN_HI(); // Start Read Busy


delay_us(100); // Delay Before Read
if (GPIO_ReadInputDataBit(LCD_DATA_PORT, LCD_D7_PIN) == Bit_SET)
{
LCD_EN_LO(); // Disable Read
LCD_RW_LO(); // Default = Write Direction

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Config D7 = Write
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = LCD_D7_PIN;
GPIO_Init(LCD_DATA_PORT, &GPIO_InitStructure);
return 1; // LCD Busy Status
}
else
{
LCD_EN_LO(); // Disable Read
LCD_RW_LO(); // Default = Write Direction

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Config D7 = Write
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = LCD_D7_PIN;
GPIO_Init(LCD_DATA_PORT, &GPIO_InitStructure);
return 0; // LCD Ready Status
}
}




/***********************/
/* Enable Pulse to LCD */
/***********************/
void enable_lcd(void) // Enable Pulse
{
delay_init(72);
LCD_EN_HI(); // Enable ON
delay_us(50);
LCD_EN_LO(); // Enable OFF
}


/************************************************** *****************************
* Print a bargraph to LCD display *
* Parameter: val: value 0..100 % *
* size: size of bargraph 1..16 *
* Return: *
************************************************** *****************************/
void lcd_bargraph (int value, int size)
{
int i;


value = value * size / 20; /* Display matrix 5 x 8 pixels */
for (i = 0; i < size; i++)
{
if (value > 5) {
lcd_putchar (0x05);
value -= 5;
}
else {
lcd_putchar (value);
break;
}
}
}




/************************************************** *****************************
* Display bargraph on LCD display *
* Parameter: pos_x: horizontal position of bargraph start *
* pos_y: vertical position of bargraph *
* value: size of bargraph active field (in pixels) *
* Return: *
************************************************** *****************************/


void lcd_bargraphXY (int pos_x, int pos_y, int value)
{
int i;


set_cursor(pos_x, pos_y);
for (i = 0; i < 16; i++)
{
if (value > 5) {
lcd_putchar (0x05);
value -= 5;
} else {
lcd_putchar (value);
while (i++ < 16) lcd_putchar (0);
}
}
}


/************************************************** ****************************/



--------------------
delay.c


#include "stm32f10x.h"
#include "delay.h"

static u8 fac_us=0;
static u16 fac_ms=0;


void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}

void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;
SysTick->VAL =0x00;
SysTick->CTRL=0x01 ;
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
//POORIA
//You can see links before reply
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us;
SysTick->VAL=0x00;
SysTick->CTRL=0x01 ;
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}


-------------------

dizgah
13-09-2014, 15:02
سلام به همگی
بنده با استفاده از کتابخونه ای که آقا پوریا باهاش تو iar کار کرده بودند تونستم ال سی دیو راه بندازم
ممنون از همگی
منتظر سوالات بعدی باشید

dizgah
15-09-2014, 19:08
سلام مهندس
اینم یه مثال برای راه اندازی spi
سلام بنده وقتی این پروژه رو کامپایل میکنم بدون ارور کامپایل میشه ولی وقتی کتابخونه های اونو تو یه پروژه جدید استفاده میکنم عنوان میکنه که توابع
spi-init و spi-i2s-deinit و spi-i2s-getflagstatus تعریف نشدن و این در صورتیه که توابع تعریف شدن ، آیا مشکل میتونه از تفاوت ورژنهای کتابخونه های std-perigh-driver باشه ؟
و سوال دیگم هم اینه مگه کتابخونه های cmsis به عنوان واسطه ارتباط با رجیسترا نیستتن ؟ و توابع اون برای راحت تر کار کردن با رجیسترا در اختبار ما نیست ؟(مثل سایر قسمتا )پس چرا ما یه فایل کتابخونه ای دگه به نام Spi ایجادکریم و توابع کار با spi رو در اون قرار دادیم ؟ یعنی خود cmsis یه تابع نوشتن و خوندن روی spi رو نداره ؟ که خب بعید به نظر میاد اومده باشن کلی تابع مختلف براش تعریف کرده باشن تو cmsis و برا نقش اصلی ارتباط این کارو نکنن! اگه هم این تابع هست چرا ما تابع زیرو تعریف میکنیم؟

unsigned char SPI1_SendByte(unsigned char data) {

unsigned char tmp_SPI_RX=0;

// Loop while DR register in not emplty
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);


// Send byte through the SPI1 peripheral
SPI1->DR = data;


// Wait to receive a byte
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
tmp_SPI_RX = SPI1->DR;

// Return the byte read from the SPI bus
return tmp_SPI_RX;
}



و توی این تابع مستقیم از رجیسترا استفاده میکنیم؟ پس اینجا cmsis به چه دردی میخوره ؟
ممنون

dizgah
16-09-2014, 01:27
سلام این مشکل هم حل شد که در نوع خود بسیار جالب و عجیب و غریب بود
البته سوالاتی که بالا پرسیدم هنوز پا برجاست
ممنون