我从事MikroC已有很长时间了,现在,我开始使用xc8-mplab X进行编码。
我正在从事一个将ds1307和pic18f46k22(i2c)连接在一起的项目。使用MikroC大约需要20分钟,但是了解MCC驱动程序会让我发疯。
我已经阅读了pic18f46k22数据表和xc8 v2.05指南。
我在Google上搜索了很多代码,但没有人为我工作(xc8版本,不支持的库,仅在pic16中工作,与mcc冲突...)
此代码对我有用(在Proteus和I2CDebugger下):
flagStartI2c1 = i2c1_driver_open(); // Init i2c1
i2c1_driver_start(); //S Start
__delay_ms(20);
i2c1_driver_TXData (0xD0); //address DS1307
__delay_ms(20);
i2c1_driver_TXData (0x07); //Register SQW/Out
__delay_ms(20);
i2c1_driver_TXData (0x90); // Out Enable 1Hz
__delay_ms(20);
i2c1_driver_stop();
analyzer: **S D0 A 07 A 90 A P**
simulation: **works OK**
当我发送Restart / RXEnable条件时问题开始
inline void i2c1_driver_startRX(void)
{
SSP1CON2bits.RCEN = 1;
}
inline void i2c1_driver_restart(void)
{
SSP1CON2bits.RSEN = 1;
}
此结果为“检测到虚假”或“ ???????????”在I2CDebugger中:
//Option 1
i2c1_driver_start();
i2c1_driver_TXData (0xD0);
i2c1_driver_TXData (0x00);
i2c1_driver_restart();----> MALFUNCTION (Spurious detected)
i2c1_driver_startRX();-----> MALFUNCTION (????? in analyzer)
sec = i2c1_driver_getRXData();---> broke tx, doesnt arrive data
min = i2c1_driver_getRXData();
hora = i2c1_driver_getRXData();
.....
analyzer: **S D0 A 00 A FF ?????????????**
//Option 2
i2c1_driver_start();
i2c1_driver_TXData (0xD0);
i2c1_driver_TXData (0x00);
sec = i2c1_driver_getRXData(); --->nothing in SSP1BUF
min = i2c1_driver_getRXData(); --->nothing in SSP1BUF
hora = i2c1_driver_getRXData(); --->nothing in SSP1BUF
....
analyzer: **S D0 A 00 A ...and nothing happens**
Mikroc中的工作流程为:
driverOpen->开始-> Tx(D0)-> Tx(00)->重新启动-> Tx(D1)-> Rx(秒)-> Rx(min)-> Rx(小时)-> .. ... NACK->停止。
我承认我对此很陌生,但是至少有人可以帮助我编写由mcc生成的驱动程序功能的工作流程吗?还是指向任何在xc8和pic18中均可使用的具有简单功能(初始化,启动,tx,rx和停止)的库的链接?
预先感谢