سلام : از اونجایی که سری های محدودی از ARM های ساخت STM ایپیرام داخلی دارن و اکثر این میکروکنترلر ها ایپیرام داخلی ندارن تصمیم گرفتم که کتابخونه ای برای کار با ایسی های ایپیرام رو بزارم ایسی های سری AT24CXX توسط این کتابخونه پشتیبانی میشن؛ این سری ایپیرام ها هم قیمت ارزونی دارن و رابطشون I2C هستش؛ یک پین هم دارن که تعیین میکنه تا اطلاعای روی ایسی قفل بشه یا نه (در صورت قفل کردن دیتاهای ایسی امکان نوشتن روی ایسی وجود نداره و و فقط میشه دیتا ها رو از رو ایسی خوند )؛ ( کتابخانه راه اندازی eeprom خارجی با stm32 )
کتابخانه راه اندازی eeprom خارجی با stm32
1 | #include "i2c.h" |
1 2 3 4 5 6 | void I2C_Configuration(void); void I2C_EE_ByteWrite(uint8_t val, uint16_t WriteAddr); uint8_t I2C_EE_ByteRead( uint16_t ReadAddr); void Delay_ms(uint32_t ms); uint16_t I2C_EE_16bit_read(uint16_t readaddr); uint8_t I2C_EE_16bit_write(uint16_t val,uint16_t writeaddr); |
1 | void I2C_Configuration(void); |
1 | void I2C_EE_ByteWrite(uint8_t val, uint16_t WriteAddr); |
1 | uint8_t I2C_EE_ByteRead( uint16_t ReadAddr); |
1 | uint8_t I2C_EE_16bit_write(uint16_t val,uint16_t writeaddr); |
نکته : برای مثال اگر در ادرس 0 یک متغیر 16 بیتی رو توی ایپیرام بریزیم این تابع از ادرس 0+1 هم برای نوشتن 8 بیت دوم متغیر 16 بیتی استفاده میکنه و در عمل دوبایت از ایپیرام رو اشغال میکنه.
1 | uint16_t I2C_EE_16bit_read(uint16_t readaddr); |
1 | #define I2C_EE I2C1//interface number |
1 2 | I2C1 I2C2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | void I2C_Configuration(void){ I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO , ENABLE);// /* Configure I2C1 pins: PB6->SCL and PB7->SDA */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_DeInit(I2C_EE); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9; I2C_InitStructure.I2C_OwnAddress1 = 1; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */ I2C_Cmd(I2C_EE, ENABLE); I2C_Init(I2C_EE, &I2C_InitStructure); I2C_AcknowledgeConfig(I2C_EE, ENABLE); } |
1 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); |
1 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE); |
1 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; |
1 2 3 4 5 6 7 | I2C_DeInit(I2C_EE); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9; I2C_InitStructure.I2C_OwnAddress1 = 1; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */ |
1 | I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void I2C_Configuration(void){ I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO , ENABLE);// /* Configure I2C1 pins: PB6->SCL and PB7->SDA */ /* Configure I2C2 pins: PB10->SCL and PB11->SDA */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_DeInit(I2C_EE); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9; I2C_InitStructure.I2C_OwnAddress1 = 1; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */ I2C_Cmd(I2C_EE, ENABLE); I2C_Init(I2C_EE, &I2C_InitStructure); I2C_AcknowledgeConfig(I2C_EE, ENABLE); } |
1 | I2C_Configuration(); |
مهمان
سلام .ممنون از توضیحات .شما بلوک RCC رو هم فعال کردید؟ کد من از قسمت RCC ارور میگیره
مهمان
سلام
I2C_EVENT_MASTER_BYTE_TRANSMITTED
این متغیر کجا تعریف شده؟هیچ کجا آدرسی ازش نیست
I2C_CheckEvent این یکی هم تابعی من ازش پیدا نکردم
ممنون میشم راهنمایی کنید
اگر به ایمیل ارسال کنید
مهمان
سلام من اصلا نمیتونم یه پروژه STM با کد ویژن درست کنم از کجا شروع کنم من میخوام برنامه نویسی STM8 رو تو کد ویژن انجام بدم چی کار کنم از کجا شروع کنم . من قبلا با بیس کام کار میکردم ولی کد ویژن تولیست چیپ هاش STM8 رو نمی بینم
مدیر سایت
سلام – کدویژن مگه فقط مخصوص میکروهای AVR نیست؟
مهمان
دادا دمت گرم آموزش زیبایی بود اما لاقل کتابخانه rcc.h داخل برنامرو هم میزاشتی که کار بده ..
مهمان
با سلام
من با stm32f1xx.h توابع رو میخوام بنویسم، یک سری متغیر ها برای مثال I2C_InitStructure.I2C_Ack و I2C_InitStructure.I2C_AcknowledgedAddress رو نمیتونم پیدا کنم که جایگزین کنم و کدها رو بر او اساس تغییر بدهم. توضیح میفرمایین برای اینکه کتابخانه ارتباط eeprom خارجی رو براساس i2c و با میکرو stm32f103 بتونم بنویسم چه کار باید کنم و چه تغییراتی نیازه؟
مهمان
سلام ممنون مطالبی که ارائه دادین.
توالع تعهریف شده بر اساس stm32f10x.h هستند، توضیح میدین همین توابع بر اساس توابع هال و stm32f1xx.h به چه صورت تغییر میکنند؟
مهمان
سلام این کتابخونه که نوشتی توی قسمت. C برای include کردن نوشتی stm32f10x_i2c.h در صورتی که نام فایل i2c هست و موقع کامپایل ارور میده که فایل. Hرو نمیتونه پیدا کنه
مهمان
با سلام و سپاس. این کتابخانه برای stm32f1 است یا برای همه خانواده stm32 می شود استفاده کرد؟ در صورت نیاز به تغییر کتابخانه، به منظور استفاده با میکرو stm32f030f4p6 چه تغییراتی نیاز است؟ ممنون
مهمان
سلام آقای زمانی خسته نباشد در کتابخانه های spl کتابخانه usb نیست نظر شما برای استفادا از usb چیه کتابخانه های hal بهتر نیست ؟❤
نویسنده این مطلب
سلام
نمیدونم چرا کتابخونه USB نیست ولی با اندک جستجویی که من کردم میشه جدا بهش اضافه کرد …
من USB رو به دلیل اینکه 48 مگ از کلاک میکرو رو میگیره نیازم نشده راه بندازم تا حالا ….