Код
.......
void Serial_Flash_Write(unsigned char byte,unsigned char card_adr,unsigned char adress_H,unsigned char adress_L)
{
SF_Start_Soft();
SF_Tx_Soft(AA1025_ADDR|card_adr|WR); //adress Memory Card
SF_Tx_Soft(adress_H); //adress High
SF_Tx_Soft(adress_L); //adress Low
SF_Tx_Soft(byte);
SF_Stop_Soft();
}
.......
CODE
.......
#define SERIAL_FLASH_DATA_DIR_SET PORTD.DIRSET|=(1<<SERIAL_FLASH_DATA)
#define SERIAL_FLASH_DATA_DIR_CLR PORTD.DIRCLR&=(1<<SERIAL_FLASH_DATA)
#define SERIAL_FLASH_DATA_SET PORTD.OUTSET|=(1<<SERIAL_FLASH_DATA)
#define SERIAL_FLASH_DATA_CLR PORTD.OUTCLR&=(1<<SERIAL_FLASH_DATA)
#define SERIAL_FLASH_SCL_DIR_SET PORTD.DIRSET|=(1<<SERIAL_FLASH_SCL)
#define SERIAL_FLASH_SCL_UP PORTD.OUTSET|=(1<<SERIAL_FLASH_SCL)
#define SERIAL_FLASH_SCL_DOWN PORTD.OUTCLR&=(1<<SERIAL_FLASH_SCL)
void SF_Init_Soft(void);
void SF_Start_Soft(void);
void SF_Stop_Soft(void);
void SF_Tx_Soft(unsigned char byte);
unsigned char SF_Rx_Soft(unsigned char last_byte);
unsigned char SF_In_Sda(void);
unsigned char SF_error_soft; //error
void SF_Init_Soft(void) //Init Programm I2C
{
SERIAL_FLASH_DATA_DIR_SET;
SERIAL_FLASH_SCL_DIR_SET;
SERIAL_FLASH_SCL_UP; //and SCL in high impedance condition
SF_error_soft=0; //for first no error :-)
}
void SF_Start_Soft(void) //Set Start condition
{
if(SF_error_soft)
return;
SERIAL_FLASH_DATA_DIR_SET;
SERIAL_FLASH_DATA_SET;
delay_us(100);
SERIAL_FLASH_SCL_UP;
delay_us(100);
SERIAL_FLASH_DATA_CLR;
delay_us(100);
SERIAL_FLASH_SCL_DOWN;
}
void SF_Stop_Soft(void) //Set Start condition
{
SERIAL_FLASH_DATA_DIR_SET;
SERIAL_FLASH_DATA_CLR;
delay_us(100);
SERIAL_FLASH_SCL_UP;
delay_us(100);
SERIAL_FLASH_DATA_SET;
delay_us(100);
if(SF_error_soft)
SF_Init_Soft();
}
void SF_Tx_Soft(unsigned char byte) //Send Byte
{
unsigned char count;
if(SF_error_soft)
return;
SERIAL_FLASH_DATA_DIR_SET;
if(SF_error_soft)
return;
for(count=0;count<8;count++)
{
if(byte&0x80)
SERIAL_FLASH_DATA_SET;
else
SERIAL_FLASH_DATA_CLR;
SERIAL_FLASH_SCL_UP;
delay_us(10);
SERIAL_FLASH_SCL_DOWN;
delay_us(10);
byte<<=1;
}
SERIAL_FLASH_DATA_DIR_CLR;
SERIAL_FLASH_SCL_UP;
SF_error_soft=SF_In_Sda();
rtcTime.status=SF_error_soft;
delay_us(10);
SERIAL_FLASH_SCL_DOWN;
delay_us(10);
}
unsigned char SF_Rx_Soft(unsigned char last_byte)
//Recieve byte,if last_byte=0, then bytes? which recieved is last, and no needed request from master
{
unsigned char data=0;
unsigned char mask=0x80;
unsigned char count;
if(SF_error_soft)
return 0;
SERIAL_FLASH_DATA_DIR_CLR;
for(count=0;count<8;count++)
{
SERIAL_FLASH_SCL_UP;
delay_us(10);
if(SF_In_Sda())
data=data+mask;
mask>>=1;
SERIAL_FLASH_SCL_DOWN;
delay_us(10);
}
SERIAL_FLASH_DATA_DIR_SET;
if(last_byte)
SERIAL_FLASH_DATA_CLR;
else
SERIAL_FLASH_DATA_SET;
SERIAL_FLASH_SCL_UP;
delay_us(10);
SERIAL_FLASH_SCL_DOWN;
delay_us(10);
return data;
}
unsigned char SF_In_Sda(void) //Return SDA_line level
{
if(PORTD.IN&(1<<SERIAL_FLASH_DATA))
return 1;
else
return 0;
}
.......
Программа работает неверно, при 4 входе в запись нет АСК.
В чем может быть причина?
Сообщение отредактировал IgorKossak - Jul 21 2011, 14:22
Причина редактирования: [codebox]