CH582 模拟的SPI就可以正常控制,芯片自带的硬件SPI死活不正常,麻烦看下,谢谢!


//模拟的SPI读


UINT8 Spi_Read_Dat(UINT8 addr)

{

  UINT8 i;

  Ic_Cs_Set(0);

  addr = ((addr<<1)&0x7E)|0x80;

  for(i=8;i>0;i--)

  {

    if(addr&0x80)Spi_Mosi_Set(1);

    else Spi_Mosi_Set(0);

    Spi_Clk_Set(1);

    addr <<= 1;

    Spi_Clk_Set(0);

  }

  for(i=8;i>0;i--)

  {

    Spi_Clk_Set(1);

    addr <<= 1;

    if(IO_Spi_Miso)addr|=0x01;

    Spi_Clk_Set(0);

  }

  Ic_Cs_Set(1);

  return addr;

}


//模拟的SPI写

void Spi_Write_Dat(UINT8 addr, UINT8 dat)

{

  UINT8 i;

  Ic_Cs_Set(0);

  addr = ((addr<<1)&0x7E);

  for(i=8;i>0;i--)

  { 

    if(addr&0x80)Spi_Mosi_Set(1);

    else Spi_Mosi_Set(0);

    Spi_Clk_Set(1);

    addr <<= 1;

    Spi_Clk_Set(0);

  }

  for(i=8;i>0;i--)

  {

    Spi_Mosi_Set(dat&0x80);

    Spi_Clk_Set(1);

    dat <<= 1;

    Spi_Clk_Set(0);

  }

  Ic_Cs_Set(1);

}

//模拟的全部可以正常工作没问题


//系统自带的硬件SPI

UINT8 Spi_Read_Dat(UINT8 addr)

{

  addr = ((addr<<1)&0x7E)|0x80;

  Ic_Cs_Set(0);

  SPI0_MasterSendByte(addr);

  addr=SPI0_MasterRecvByte();

//硬件SPI 写

void Spi_Write_Dat(UINT8 addr, UINT8 dat)

{

  addr = ((addr<<1)&0x7E);

  Ic_Cs_Set(0);

  SPI0_MasterSendByte(addr);

  SPI0_MasterSendByte(dat);


  GPIOPinRemap(ENABLE, RB_PIN_SPI0);                       //重新映射SPI

  GPIOB_ModeCfg(SPI_CLK_PIN|SPI_MOSI_PIN|IC_CS_PIN|IC_RESET_PIN,GPIO_ModeOut_PP_5mA);

  SPI0_MasterDefInit();


void SPI0_MasterDefInit( void )

{

    R8_SPI0_CLOCK_DIV = 8;// 主频时钟4分频,最小分频2,读卡只能是3,2太快4太慢,LCD可以是2

    R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR;

    R8_SPI0_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE ;

    R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF;     // 访问BUFFER/FIFO自动清除IF_BYTE_END标志

    R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;    // 不启动DMA方式

}


你好,硬件SPI问题可以具体描述一下。

我们这里有使用硬件SPI进行主从传输数据并无问题,直接使用例程测试即可。

有一篇关于SPI实际使用的博客可以参考:

CH58xSPI0中断DMA - SweetTea_lllpc - 博客园 (cnblogs.com)


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