STM8的SPI

2019-07-19 20:17发布

本帖最后由 fankai 于 2017-3-24 15:04 编辑

有一块Nokia 5110的屏,想弄到我的小板子上,显示信息,调试程序方便些,于是根据买的5110的资料开始移植程序,资料给的是51的模拟SPI方式,挺简单的,暂时先没用,stm8自带有SPI外设,操作起来也方便,于是就开始设置SPI外设,如下,LCD只用到写MOSI就可以了,本以为这样就完成,显示字符、数字,字符串等,结果时钟不显示任何信息,然后拿示波器测CLK,MOSI,都有波形产生,这里还没产生太大怀疑,但LCD时钟显示不出来,折腾了好久,没办法,用模拟SPI试试,结果一次通过,真让人气愤啊,看了一下模拟SPI和硬件SPI的波形,有些不一样,好好的硬件SPI怎么就不能工作呢,又在网上找了好多类似的硬件SPI的操作,检查到底哪里写的不对,查了好久也没发现有什么不对,昨天也比较晚了,心想就算了吧,结果突然想起一个事,那就是LCD我只用到了MOSI,由于不用MISO,我心里原本想,既然不用,那就不用设置了,问题就出在这里,加上一句话,设置MISO的引脚为输入状态,一次通过,我想了一下,是不是这样,SPI是一个完成的硬件外设,不设置MISO的话,移位寄存器不能正常工作,所以尽管有输出,但输出不正常,这样的话,即使不用MISO,这个引脚也不能用作别的用途,白白浪费了,索性最后直接用模拟方式吧,一个MOSI就够了,不知道大家有没有遇到过这种STM8或STM32只需要MOSI,不需要MISO的情况,不设置MISO引脚位输入,SPI能否正常工作???

[mw_shl_code=c,true]void spi_init(void)
{
          //初始化SPI
        CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);                        //开启SPI时钟
        GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);                //PB6   MOSI                不需要MISO
        GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);                //PB5   CLK       
//        GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);
        SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_4, SPI_Mode_Master, SPI_CPOL_Low, SPI_CPHA_2Edge, SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
        SPI_Cmd(SPI1, ENABLE);                                                                                        //使能SPI1      
}

void n5110_write_byte(u8 dat, u8 command)
{
          u8 i = 0;
    LCD_CE_LOW;
    if (command == 0)
        {
                LCD_DC_LOW;                        //写命令
        }
    else
        {
             LCD_DC_HIGH;                //写数据       
        }
       
        //模拟方式
       
        for(i=0;i<8;i++)
        {
                if(dat&0x80)
                          LCD_DIN_HIGH;
                else
                          LCD_DIN_LOW;
               
                LCD_CLK_LOW;
                dat <<= 1;
                LCD_CLK_HIGH;
        }
}
       
//        while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);                //等待,确保发送之前,发送缓存区是空的
//        SPI_SendData(SPI1, dat);
//        while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);                //等待发送完成,发送缓存区空,否则连续传输会有问题
        LCD_CE_HIGH;
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。