2017-06-21 17 views
2

でSPIを介してデータを送信/受信しません、MODER = 0xa2a0556aSTM32072RBは、私は次のような構成とスレーブモードでSPI2を介してデータを送受信するためのuCを使用していますスレーブモード

また、APB1ENRも正しく構成されています。

現在のプログラムは、RXNEフラグをチェックし、受信したデータをDRから読み取り、ランダム値をDRに送信します。

ステータスレジスタには次の値があります。SR = 0x1403 マスタがデータを正しく送信し、スレーブピンで信号をチェックしました(クロック位相と極性が両側で同じで、NSS信号がクリアされています) MOSIを介してSCKとデータを送信する前に)。私はピンを入力として設定していて、マスターが送ることができるデジタル信号を読み取ることができることを知っています。現在の設定では、マスターがデータを送信するときにRXNEが設定されているが、読み取り値は常に0x00であるため、スレーブは何かを受信するようです。私はさまざまな構成(ソフトウェア/ハードウェアNSS、異なるデータサイズ...)を試みましたが、私は常に0x00を取得します。さらに、DRを読み込んだ後に送信するランダム値は出力に送られません。それは私の現在の機能であり、これは連続的に呼び出されます:

unsigned char spi_rx_slave(unsigned char spiPort, unsigned char *receiveBuffer) 
{ 
uint8_t temp; 
static unsigned long sr; 
if (!spi_isOpen(spiPort)) 
{ 
sendDebug("%s() Error: spiPort not in use!\r\n",__func__); 
return false; 
} 
if (spiDescriptor[spiPort]->powerdown == true) 
{ 
sendDebug("%s() Error: spiPort in powerdown!\r\n",__func__); 
return false; 
} 
/* wait till spi is not busy anymore */ 
while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY) 
{ 
sendDebug("SPI is busy(1)\r\n"); 
vTaskDelay(2); 
} 
sendDebug("CR1 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR1); 
sendDebug("CR2 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR2); 
sendDebug("AFRH address = 0x%08x, AFRH value = %08x, ", (unsigned long*)(GPIOB_BASE+0x24), *(unsigned long*)(GPIOB_BASE+0x24)); 
sendDebug("MODER address = 0x%08x, MODER value = %08x\r\n", (unsigned long*)(GPIOB_BASE), *(unsigned long*)(GPIOB_BASE)); 
sr = spiDescriptor[spiPort]->spiBase->SR; 
while(sr & SPI_SR_RXNE) 
{ 
/* get rx byte */ 
temp = *(uint8_t *)&(spiDescriptor[spiPort]->spiBase->DR); 
spiDescriptor[spiPort]->spiBase->DR = 0x53; 
sendDebug("-------->DR address = 0x%08x, data received: 0x%02x\r\n", &spiDescriptor[spiPort]->spiBase->DR, temp); 
sendDebug("SR = 0x%04x\r\n", sr); 
vTaskDelay(1); 
sr = spiDescriptor[spiPort]->spiBase->SR; 
} 
while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY) 
{ 
sendDebug("SPI is busy(2)\r\n"); 
vTaskDelay(2); 
} 
return true; 
} 

私は間違っていますか?私が正しく構成しなかったものはありますか?前もって感謝します。 よろしくお願いします。 Javier

+1

_ "CR1 = 0x0078、CR2 = 0x0700、AFRH = 0x55353500、MODER = 0xa2a0556a"まず質問と構成を人間が読めるようにします。私たちの時間を尊重してください。 –

+0

マスターはクロックを生成しますか?そうでない場合は、何も送信しません。バイトを送信する場合は、DRをバイトにキャストする必要があります。 –

+0

はい、マスタはクロックを正しく生成し、そのクロックを受信するとSPIはRXNEフラグをアクティブにします。 – JaviC

答えて

0

ソフトウェアNSSに切り替え、オンラインで見つかったCUBEの例のレジスタ値をコピーしました。私はこのプロジェクトでこれらのライブラリを使用することはできませんが、私は同じ動作をしたいと思います。新しい値は、次のとおり

FPCLK/256(通信速度のために適切なもの)を意味CR1 = 0x0278 、SPIが有効とSSM = 1(ソフトウェアNSS)。

CR2 = 0x1700 FIFOレベルが1/4(8ビット)以上の場合、8ビットデータとRXNEイベントが生成されることを意味します。

AFRH = 0x55303500、MODER = 0xa8a1556a これは、MISO、MOSI、SCK代替機能5(SPI2)を意味します。 NSSはソフトウェアモード(スレーブは常に選択)になっているため、設定されていません。

私はまだ同じ結果を得ており、これらのライブラリを使ったevalkitはSPI1を使ってうまく動作します。したがって、レジスタ値とは何の関係もない別の問題が存在しなければなりません。ピンはいくつかのクロックを取得する必要がありますか? ありがとう!

関連する問題