Просто для информации:
Программный SPI на STM32F405 REV_A и REV_Z
(не спрашивайте почему программный, на то были причины, суть не в этом).
Код:
CODE
#define ADDR_L ADDR_PORT->BSRRH = ADDR_PIN
#define ADDR_H ADDR_PORT->BSRRL = ADDR_PIN
//
#define SDA_L SDA_PORT->BSRRH = SDA_PIN
#define SDA_H SDA_PORT->BSRRL = SDA_PIN
//
#define SCL_L SCL_PORT->BSRRH = SCL_PIN
#define SCL_H SCL_PORT->BSRRL = SCL_PIN
//
#define CS_L CS_PORT->BSRRH = CS_PIN
#define CS_H CS_PORT->BSRRL = CS_PIN
//-------------------------------------------------
static __INLINE void SendByte(u8 c){
if(c &0x80) SDA_H; else SDA_L; SCL_H;
if(c &0x40) SDA_H; else SDA_L; SCL_L; SCL_H;
if(c &0x20) SDA_H; else SDA_L; SCL_L; SCL_H;
if(c &0x10) SDA_H; else SDA_L; SCL_L; SCL_H;
if(c &0x08) SDA_H; else SDA_L; SCL_L; SCL_H;
if(c &0x04) SDA_H; else SDA_L; SCL_L; SCL_H;
if(c &0x02) SDA_H; else SDA_L; SCL_L; SCL_H;
if(c &0x01) SDA_H; else SDA_L; SCL_L; SCL_H;
SCL_L;
}
//---------------------------------------
void Write_REG(u8 c){
CS_L;
ADDR_L;
SendByte©;
CS_H;
}
Результат длительности CS (по осциллографу) в различных условиях:
// ~1,3uS w/o OPT for 'A'
// ~1,0uS w/o OPT for 'Z'
// ~0.85uS with OPT Level 3 + Otp to Time for 'A'
// ~0.6uS with OPT Level 3 + Otp to Time for 'Z'
Сообщение отредактировал IgorKossak - Feb 19 2013, 16:39
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!