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;

}


调用SPI0_SlaveDMATrans(TX_DATA, 12);发数据? 官方例子中没有看到初始化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程序是在状态机中完成的, 相关代码没有附上,查看波形是对的


图片第一行是SCK

第二行是cs

第三是MOSI

第四是MISO


收发的数据都是乱的

111.png


最新的进展:

首先感谢官方的工作人员,最近对沁恒的芯片使用起来非常的上瘾,功耗非常的低,目前我们已经把整个项目的芯片全换成沁恒的了,虽然有一定的工作量,但是考量之后我们还是决定要去做。


CH32F103我们重新基于官方的例程重新编写,目前能够正常发送数据了,可能的原因是版本问题?或者我们哪个地方代码有错误。


我们现在把2颗582焊下了,只留了一个CH32F103和一个582F通讯,用的都是官方的最基本例程,目前103能发,但是582不能正常发。


582F方面我们发现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);


? ? /* 配置串口调试 */

? ? 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


只有登录才能回复,可以选择微信账号登录