Не могу опросить магнитометр по 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->OSPEEDR=0xFFFFFFFF;
GPIOB->AFR[0] |= 0x44000000; //настройка линий PB7,PB6 на функцию AF4
GPIOE->MODER=0x55555555; //настройка порта Е на выход
EXTI->EMR=1<<23;
EXTI->IMR=1<<23;
NVIC_EnableIRQ(I2C1_EV_IRQn);
//инициализация 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->CR2=(1<<25);//AUTOEND
I2C1->CR1|=(1<<0); //PE=1
I2C1->CR2 = 0x03<<1;//adress
I2C1->CR2|=1<<13;//start
??????
a1=I2C1->RXDR;
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;}