近日淘宝买了12864oled小屏,是4线spi口的。由于自己驱动程序写得糟,只有在某些脚接触不良时偶然能够点亮。苦于无法与ssd1306通信,连其状态都无法了解,于是查资料将4线spi改为iic。经过努力,iic从ssd1306已经得到了准确的ack应答(尝试过改变地址码和“控制码”,立刻就得不到ack)。但是,找了网上若干资料仍然没有找到合适的ssd1306初始化的命令序列。
现求ssd1306初始化命令序列,做过串行对通ssd1306的各位给些指点也非常欢迎。商家似乎无力给足够技术支持了。
预先致谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
for example, using functions:
void i2c_start(void) {
SSP1CON2bits.SEN = 1; //SET SEN
while (!PIR1bits.SSP1IF); //WAIT ACK FROM SLAVE
PIR1bits.SSP1IF =0; //CLEAR FLAG
}
void i2c_write(unsigned char dat) {
SSP1BUF = dat; //ADRRESS OF the oled
while (!PIR1bits.SSP1IF); //WAIT ACK FROM SLAVE
PIR1bits.SSP1IF =0; //CLEAR FLAG
}
and your code becomes
i2c_start(); //send the start condition
i2c_write(0x78);
...
i2c_stop(); //send the stop condition
far more readable than your existing code.
also, if you were to change to software i2c, you just need to change the i2c routines and the above code stays the same.
one suggestion: you can restructure the code to make it more portable and readable.
for example, using functions:
void i2c_start(void) {
ssp1con2bits.sen = 1; //set sen
while (!pir1bits.ssp1if); //wait ack from slave
pir1bits.ssp1if =0; //clear flag
}
far more readable than your existing code.
also, if you were to change to software i2c, you just need to change the i2c routines and the above code stays the same.
-----------------------------------------------------------------------
谢谢指正!
我主要是担心函数调用引进时延会带来误码,所以就用执行时间最确定的方式累赘地写代码了。
我写的笨方式的代码在100k没有问题,当时钟到1M也跑得正常,之后放到400k就比较稳妥了。
我确实不知道起始条件和结束条件与通信过程之间的时间间隔允许多大。不过有了1M调通的底,按你说的模式改得好看一点肯定行得通。
再次感谢!
一周热门 更多>