OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4000|回复: 3

STM8的SPI

[复制链接]

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-3-24 14:59:24 | 显示全部楼层 |阅读模式
本帖最后由 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]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-12-20 08:05:32 来自手机 | 显示全部楼层
没有做过5110我前几天做的硬件ht1621一开始也是各种不行,后来发现是spi极性设置不对
回复 支持 反对

使用道具 举报

2

主题

45

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4172
金钱
4172
注册时间
2013-12-27
在线时间
449 小时
发表于 2018-1-12 10:06:47 | 显示全部楼层
四线制SPI是输入和输出同时进行的,硬件SPI的 MISO在输入的时候MOSI才能输出
回复 支持 反对

使用道具 举报

0

主题

295

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-3-26
在线时间
9 小时
发表于 2019-4-10 08:56:57 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 16:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表