【发布时间】:2018-09-22 12:14:23
【问题描述】:
我正在尝试使用我的 Micro OLED Sparkfun 显示器(这是数据表 enter link description here),但我遇到了代码问题。也许是代码中的问题,因为我第一次在 Atmel 使用 SPI,所以如果有人这么好,请检查一下,给我一些建议,我会非常感激。
编辑:这是显示线的更改代码和图片
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
#define SCK DDB5
#define SDIN DDB3
#define D_C DDB0
#define CS DDB2
#define RST DDB1
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDRB = (1<<SCK)|(1<<SDIN)|(1<<D_C)|(1<<CS)|(1<<RST);
/* Enable SPI, Master, set clock rate fck/16 */
PORTB |= (1<<CS);
PORTB |= (1<<D_C);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<DORD);
}
void SPI_MasterTransmit_Command(int cCommand)
{
PORTB &= ~(1<<CS);
PORTB &= ~(1<<D_C);
_delay_ms(200);
/* Start transmission */
SPDR = cCommand;
/* set dc and cs low to send command */
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
/* set dc cs high again */
PORTB |= (1<<CS);
PORTB |= (1<<D_C);
}
void Display_ON(void)
{
PORTB &= ~(1<<RST);
_delay_ms(50);
PORTB |= (1<<RST);
_delay_ms(50);
PORTB &= ~(1<<RST);
_delay_ms(50);
SPI_MasterTransmit_Command(0xAF);
_delay_ms(200);
}
int main(void)
{
SPI_MasterInit();
Display_ON();
SPI_MasterTransmit_Command(0xA5);
}
【问题讨论】:
-
显示控制器如何与板子连接?什么是PB0? PB1? CS# 在哪里连接以及在哪里控制?您的代码中没有在命令之前拉下某些东西并在之后将其拉起的地方。
-
我建议您在断言片选之前更改 C/D。不要认为这是你的问题,但你不想在那里比赛。
-
如果您在芯片中使用 spi 外设,最好有一个示波器。它们现在便宜得多,大约 250 美元,您可以获得一个非常适合此应用程序的 4 通道。如果没有得到一些 LED 将它们放在 MCU 的输出上,请尝试尽可能慢地为 MCU 计时,看看您是否可以直观地看到 LED 上的状态变化。如果没有得到另一个单片机并用它来轮询线路,把它变成一个逻辑分析仪。假设芯片供应商的文档有问题,即使文档中只有一个错误,它也可能出现在您正在处理的外围设备中......
-
忽略“模式”数字查看从机的数据表,在示波器或逻辑分析仪上确保数据在正确的半时钟边沿上更改状态,以便从机在正确的时钟边沿上对其进行采样时钟边沿。反之亦然,尽管使用这样的显示,您通常不需要回读任何内容。
-
移除第二个 PORTB &= ~(1Display_ON(),否则显示将保持在重置状态