Jump to content

опросить магнетометр на stm32f3descovery

Recommended Posts

Не могу опросить магнитометр по I2C. На линиях какие-то сигналы проскакивают, но никакого результата не могу достичь. Кто-то что-то знает по этому поводу? Как заставить работать его.


#include "stm32f30x.h"

int a1=0, j=0;
int main(void)
RCC->AHBENR|=RCC_AHBENR_GPIOBEN;// тактирование портa B включено
RCC->AHBENR|=RCC_AHBENR_GPIOEEN;//21 тактирование портa Е включено
RCC->APB1ENR|=RCC_APB1ENR_I2C1EN;// тактирование I2C1 включено

GPIOB->MODER|=0x0000A000; // альтернативная функция линий PB7,PB6
GPIOB->OTYPER|=(1<<6);  //настройка линии PB7 на выход открытый сток
GPIOB->OTYPER|=(1<<7);  //настройка линии PB6 на выход открытый сток
GPIOB->AFR[0] |= 0x44000000;  //настройка линий PB7,PB6 на функцию AF4

GPIOE->MODER=0x55555555; //настройка порта Е на выход


//инициализация I2C мастер
I2C1->CR1=(0<<0); //PE=0

I2C1->TIMINGR=(0x4<<28);//PRESC[3:0]: Timing prescaler
I2C1->TIMINGR=(0x8<<20);//SCLDEL[3:0]: Data setup time
I2C1->TIMINGR=(0x8<<16);//SDADEL[3:0]: Data hold time
I2C1->TIMINGR=(0xC3<<8);//SCLH[7:0]: SCL high period (master mode)
I2C1->TIMINGR=(0xC7<<0);//SCLL[7:0]: SCL low period (master mode)

I2C1->CR1=(0<<17);//для мастера = 0 NOSTRETCH: Clock stretching disable
I2C1->CR1=(1<<6);//TCIE: Transfer Complete interrupt enable
I2C1->CR1=(1<<2);//RXIE: RX Interrupt enable(RXNE)
I2C1->CR1=(1<<1);//TXIE: TX Interrupt enable(TXIS)
I2C1->CR2=(0<<11);//ADD10=0 -7 bits
I2C1->CR2=(0<<10);//RD_WRN=0 передача
I2C1->CR1|=(1<<0); //PE=1

I2C1->CR2 = 0x03<<1;//adress 



    while (1){
    //    I2C1->CR2|=1<<13;//start
        if((a1&0x1)>0)    GPIOE->ODR =1<<9;
        else            GPIOE->ODR =(0<<9);

        if((a1 & 0x2)>0)    GPIOE->ODR |=1<<10;
        else            GPIOE->ODR &= ~(1<<10);

        if((a1 & 0x4)>0)    GPIOE->ODR |=1<<11;
        else            GPIOE->ODR &= ~(1<<11);

        if((a1 & 0x8)>0)    GPIOE->ODR |=1<<12;
        else            GPIOE->ODR &= ~(1<<12);

        if((a1 & 0x10)>0)    GPIOE->ODR |=1<<13;
        else            GPIOE->ODR &= ~(1<<13);

        if((a1 & 0x20)>0)    GPIOE->ODR |=1<<14;
        else            GPIOE->ODR &= ~(1<<14);

        if((a1 & 0x40)>0)    GPIOE->ODR |=1<<15;
        else            GPIOE->ODR &= ~(1<<15);

        if((a1 & 0x80)>0)    GPIOE->ODR |=1<<8;
        else            GPIOE->ODR &= ~(1<<8);


void I2C1_EV_EXTI23_IRQHandler () {a1=2;}


Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Create New...