中级会员
- 积分
- 317
- 金钱
- 317
- 注册时间
- 2016-11-1
- 在线时间
- 64 小时
|
本帖最后由 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] |
|