CH582F和CH32F103的SPI一主多從通訊的問題

3個582從機一個103作為主機


582端的代碼

GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU);

void SPI0_SlaveInit(void)

{

? ? R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR;

? ? R8_SPI0_CTRL_MOD = RB_SPI_MISO_OE | RB_SPI_MODE_SLAVE | RB_SPI_MST_SCK_MOD;

? ? R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF;

}


調(diào)用SPI0_SlaveDMATrans(TX_DATA, 12);發(fā)數(shù)據(jù)? 官方例子中沒有看到初始化DMA的代碼,照搬過來的


103端的代碼

void SPI_FullDuplex_Init( void )

{

? ? GPIO_InitTypeDef GPIO_InitStructure = {0};

? ? SPI_InitTypeDef SPI_InitStructure = {0};


? ? RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init( GPIOA, &GPIO_InitStructure );


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

? ? GPIO_Init( GPIOA, &GPIO_InitStructure );


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init( GPIOA, &GPIO_InitStructure );


? ? SPI_SSOutputCmd( SPI1, ENABLE );


? ? SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

? ? SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

? ? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

? ? SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;? ?//high vatage in idle state

? ? SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;? //raise clock sampling

? ? SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

? ? SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;

? ? SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;

? ? SPI_InitStructure.SPI_CRCPolynomial = 7;

? ? SPI_Init( SPI1, &SPI_InitStructure );


? ? SPI_Cmd( SPI1, ENABLE );

111.png

SPI的CS程序是在狀態(tài)機中完成的, 相關代碼沒有附上,查看波形是對的


圖片第一行是SCK

第二行是cs

第三是MOSI

第四是MISO


收發(fā)的數(shù)據(jù)都是亂的

111.png


最新的進展:

首先感謝官方的工作人員,最近對沁恒的芯片使用起來非常的上癮,功耗非常的低,目前我們已經(jīng)把整個項目的芯片全換成沁恒的了,雖然有一定的工作量,但是考量之后我們還是決定要去做。


CH32F103我們重新基于官方的例程重新編寫,目前能夠正常發(fā)送數(shù)據(jù)了,可能的原因是版本問題?或者我們哪個地方代碼有錯誤。


我們現(xiàn)在把2顆582焊下了,只留了一個CH32F103和一個582F通訊,用的都是官方的最基本例程,目前103能發(fā),但是582不能正常發(fā)。


582F方面我們發(fā)現(xiàn)SPI的模塊比較簡單,只支持SCK閑置低電平和上升沿采樣,所以CH32F103的官方代碼我們有做修改以適配582.


CH32F103的代碼

void SPI_FullDuplex_Init( void )

{

? ? GPIO_InitTypeDef GPIO_InitStructure = {0};

? ? SPI_InitTypeDef SPI_InitStructure = {0};


? ? RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init( GPIOA, &GPIO_InitStructure );


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

? ? GPIO_Init( GPIOA, &GPIO_InitStructure );


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init( GPIOA, &GPIO_InitStructure );


? ? SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

? ? SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

? ? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;??//僅僅僅僅僅僅僅僅修改了這個地方

? ? SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;? ? ? ? ? //僅僅僅僅僅僅僅僅修改了這個地方

? ? SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;?? ??//僅僅僅僅僅僅僅僅修改了這個地方

? ? SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

? ? SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;

? ? SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;

? ? SPI_InitStructure.SPI_CRCPolynomial = 7;

? ? SPI_Init( SPI1, &SPI_InitStructure );


? ? SPI_Cmd( SPI1, ENABLE );

}


while( 1 )

{??

if( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE ) != RESET )

?{

? ?TxData[0] = 0x56;

? ? ? ? ? ? SPI_I2S_SendData(SPI1, TxData[0]);

? ? ? ? ?}

if( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE ) != RESET )

? ? ? ? {

? ?rsttida = systida;

? ? ? ? ? ? RxData[pindex++] = SPI_I2S_ReceiveData(SPI1);

}

}


582方面的代碼

void SPI0_SlaveInit(void)

{

? ? R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR;

? ? R8_SPI0_CTRL_MOD = RB_SPI_MISO_OE | RB_SPI_MODE_SLAVE;

? ? R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF;

}

int main()

{

? ? UINT8 i;


? ? SetSysClock(CLK_SOURCE_PLL_60MHz);


? ? /* 配置串口調(diào)試 */

? ? DebugInit();

? ? PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);




#if 1

? ? /* 設備模式 */

? ? PRINT("1.spi0 mul slave mode \n");

? ? GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU);

? ? SPI0_SlaveInit();

? ? i = SPI0_SlaveRecvByte();

? ? SPI0_SlaveSendByte(~i);


? ? SPI0_SlaveRecv(spiBuffrev, 12);

? ? SPI0_SlaveTrans(spiBuffrev, 12);

? ? SPI0_SlaveDMARecv(spiBuffrev, 12);

? ? SPI0_SlaveDMATrans(spiBuffrev, 12);

? ? PRINT("END ...\n");


? ? while(1);

#endif


? ? while(1);

}


111.png


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频