STM32F103 SPI Master Slave Проблема с получением - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь установить связь между главным и подчиненным устройствами stm32f103 (bluepills). Но у меня проблемы с получением. Когда я подключаю свой мастер к анализатору logi c, я вижу MOSI, как на рисунке

Logi c Анализатор

На рисунке MOSI отправляет " Буква Y Но не все тактовые импульсы одинаковы. (Я не знаю, является ли это причиной сбоя связи)

вот мои схемы и мой код, который я упростил настолько, насколько смог.

Мастер Код:

    int i;


RCC ->APB2ENR |= 0x00001004; //SPI1,GPIOA clock en

GPIOA ->CRL &= 0x00000000;
GPIOA ->CRL |= 0xb0b33333;


SPI1->CR1  = SPI_CR1_SSM| SPI_CR1_SSI| SPI_CR1_MSTR|SPI_CR1_BR_2;  

SPI1->CR1  |= SPI_CR1_SPE;  // enable SPI

    while(1){

SPI1 -> DR  = 'A';

for(int i = 0 ;i<400000;i++);

while( !(SPI1->SR & SPI_SR_TXE) );  // wait until transmit buffer empty

    }

и подчиненный

    int i;
RCC ->APB2ENR |= 0x0000100c; //SPI1,GPIOA,GPIOB clock en

GPIOB ->CRH &= 0x00000000;
GPIOB ->CRH |= 0x33333333;
GPIOA ->CRL &= 0x00000000;
GPIOA ->CRL |= 0x4b443333;
GPIOA ->CRH &= 0x00000000;
GPIOA ->CRH |= 0x33333333;


SPI1->CR1  = SPI_CR1_SSM| SPI_CR1_SSI| SPI_CR1_BR_2;
SPI1->CR1  |= SPI_CR1_SPE;  // enable SPI
SPI1->CR1 &=~SPI_CR1_MSTR;  //disable master

 for(int c=0;c<5;c++){
LCD_INIT(cmd[c]);
}

while(1){




     while( !(SPI1->SR & SPI_SR_RXNE));

        char a = SPI1 ->DR;

 for (i=0;i<400000;i++);

 LCD_DATA(a);


 for (i=0;i<400000;i++);

 }
 }

Мои схемы c: Схемы c

Проблема в том, что раб не получать любые данные. Застрял в л oop while( !(SPI1->SR & SPI_SR_RXNE));

1 Ответ

1 голос
/ 12 февраля 2020

Во-первых, каковы ваши частоты шины HCLK и APB2? Если я не ошибаюсь, вы, кажется, используете (fPLCK / 32) для синхронизации SPI, и ваш анализатор logi c показывает тактовую частоту ~ 2 или 3 МГц. Если ваша частота APB2 выше предела 72 МГц, у вас могут возникнуть проблемы с часами.

В ведомом устройстве вы используете SSM (управление ведомым программным обеспечением) и активируете SSI (выбор внутреннего ведомого устройства). Название бита SSI вводит в заблуждение: он имитирует физический вывод NSS. Поэтому, когда SSI = 1, ведомое устройство выбрано , а не . Вероятно, это причина того, что ведомое устройство игнорирует входящие байты.

...