1

STM32F103ZE を使用していますが、SPI データを正しく取得できません。マスターは正しく送信しています。ただし、ゼロ以外の値が送信された場合は、常にゼロとして読み取られます。

マスター構成: (MSP430)

マスター構成は正しいです。(私はそれをテストしました。)
マスターモード、MSB ファースト、8 ビット SPI、
非アクティブ状態はハイ、SS 接地、1 MHz クロック、分周器なし

スレーブ構成 (STM32F103ZE)

    SPI2を使用。
    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx
    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB
    SPI_InitStructure.SPI_CRCPolynomial = 7

誰でも答えを持っています。

ありがとうハリ

4

2 に答える 2

5

私は知っている、質問はかなり古いです。それでも、私は昨日同じ問題に直面したので、将来の読者のために答えを出そうと思います。

次のコードは、STM32検出ボードで使用されるSTM32F407で機能します。データシートからわかるように、SPIペリフェラルはSTM32F103と同じであるため、コードは変更なしで他のマイクロコントローラーで実行されると思います。

#include "stm32f4xx.h"

[... configure the pins SCK, MISO, MOSI and NSS ...]

// Configure the SPI as: Slave, 8 bit data, clock high when idle, capture on 
// 1st edge, baud rate prescaler 2, MSB first.
SPI1->CR1 = SPI_CR1_CPOL;
// No interrupts, no DMA and Motorola frame format.
SPI1->CR2 = 0;
// Enable the peripheral.
SPI1->CR1 |= SPI_CR1_SPE;

// Wait until some data has been sent to the slave and print it.
while ((SPI1->SR & SPI_SR_RXNE) == 0);
printf("Received: %d\n", SPI1->DR);

この初期化手順では、質問に投稿されたコードとは2つの点が異なります。

  1. SCK、MISO、MOSIの3ラインの通常のSPIには双方向モードを選択しないでください。MISOとMOSIはどちらも単方向の回線です。

  2. ハードウェアスレーブ選択管理を使用しています。つまり、ビットSSMが設定されていません。このようにして、SPIペリフェラルはデバイスがアサートされたとき(ピンNSSがローになるとき)を自動的に検出し、MOSIビットをシフトレジスタに格納します。十分なビットが読み取られると(選択したデータ形式に応じて8または16)、RXNEステータスレジスタにフラグが設定され、送信された値をレジスタから読み取ることができますDR

お役に立てば幸いです。

于 2012-07-17T11:58:54.490 に答える
3

データレジスタから 0x00 値を取得するというまったく同じ問題がありました。

私の場合、問題は MISO ラインが浮動入力として設定されていたことです。OType_PP に変更すると動作します。STM32F429 の構成コードは次のとおりです。

void SPI1_Config(void){
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIOE->BSRRL |= GPIO_Pin_7;

SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1, &SPI_InitStruct);

SPI_Cmd(SPI1, ENABLE);}

そして送信機能:

uint8_t SPI1_Send(uint8_t data){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

SPI_I2S_SendData(SPI1, data);

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

return SPI_I2S_ReceiveData(SPI1);}
于 2014-08-25T14:16:54.160 に答える