Здравствуйте, еще раз благодарю за поддержку.
Проблема почти исчерпана, теперь вся память, кроме регистров с значением преобразования, читается правильно.
С регистрами , котрые хранят значения преобразования, после преобразования читаются FF-ми. Думаю что ето не в микросхеме, т.к провел над ней серию тестов.
Думаю, что что-то с удержанием шины.
Вот исправленный код:
Код
#include "io78f9222.h"
#include <intrinsics.h>
#define SCL P2_bit.no1
#define SDA P2_bit.no2
#define SCL_IN PM2_bit.no1
#define SDA_IN PM2_bit.no2
#define _1600_ns 0x04
#define _3300_ns 0x08
extern void _delay(unsigned int tt);
void ini()
{
SCL_IN = 1;
SDA_IN = 1;
}
void i2c_dly(void)
{
_delay(_3300_ns);
_delay(_3300_ns);
_delay(_3300_ns);
}
void i2c_start(void)
{
SDA_IN = 1;
SCL_IN = 1;
i2c_dly();
SDA_IN = 0;
SDA = 0;
i2c_dly();
SCL_IN = 0;
SCL = 0;
i2c_dly();
}
void icc_reset(void)
{
i2c_start();
i2c_start();
}
void i2c_stop(void)
{
SDA_IN = 0;
SDA = 0;
i2c_dly();
SCL_IN = 1;
i2c_dly();
SDA_IN = 1;
i2c_dly();
}
unsigned char i2c_rx(char ack)
{
unsigned char x, d=0;
SDA_IN = 1;
for(x=0; x<8; x++)
{
d <<= 1;
do
{
SCL_IN = 1;
__no_operation();
__no_operation();
__no_operation();
}
while(SCL==0);
i2c_dly();
if(SDA)
{
d |= 1;
}
SCL_IN = 0;
SCL = 0;
i2c_dly();
}
if(ack)
{
SDA_IN = 0;
SDA = 0;
}
else
{
SDA_IN = 1;
}
do
{
SCL_IN = 1;
__no_operation();
__no_operation();
__no_operation();
}
while(SCL==0);
//SCL_IN = 1;
i2c_dly();
SCL_IN = 0;
SCL = 0;
i2c_dly();
SDA_IN = 1;
return d;
}
unsigned char i2c_tx(unsigned char d)
{
unsigned char x;
unsigned char b;
for(x=0; x<8; x++)
{
if(d&0x80)
{
SDA_IN = 1;
}
else
{
SDA_IN = 0;
SDA = 0;
}
do
{
SCL_IN = 1;
__no_operation();
__no_operation();
__no_operation();
}
while(SCL==0);
//SCL_IN = 1;
d <<= 1;
i2c_dly();
SCL_IN = 0;
SCL = 0;
i2c_dly();
}
SDA_IN = 1;
do
{
SCL_IN = 1;
__no_operation();
__no_operation();
__no_operation();
}
while(SCL==0);
//SCL_IN = 1;
i2c_dly();
b = SDA;
SCL_IN = 0;
SCL = 0;
i2c_dly();
return b;
}