这里给出IIC初始化的程序,谢谢大家关注
#define bit_is_set(sfr, bit) ( sfr & _BV(bit) ) #define bit_is_clear(sfr, bit) ( ! (sfr & BIT(bit)) ) #define loop_until_bit_is_set(sfr, bit) do { } while (bit_is_clear(sfr, bit)) #define loop_until_bit_is_clear(sfr, bit) do { } while (bit_is_set(sfr, bit)) #define cbit(sfr, bit) ( sfr &= (~bit) ) #define cbi(sfr, bit) ( sfr &= ~ BIT(bit) ) #define sbi(sfr, bit) ( sfr |= BIT(bit) ) #define inb(sfr) sfr #define outb(sfr, val) ( sfr = (val) ) #define outp(val, sfr) outb(sfr, val) #define inp(sfr) inb(sfr) #define inw(sfr) sfr #define outw(sfr, val) ( sfr = val ) /* ---- MIN/MAX/ABS macros ----- */
#define MIN(a,b) ((a<b)?(a):(b)) #define MAX(a,b) ((a>b)?(a):(b)) #define ABS(x) ((x>0)?(x):(-x))
/********************************************************************************************************** * 函数介绍: * 输入参数:-- * 输出参数:-- * 返 回 值:-- **********************************************************************************************************/ void i2cSetBitrate(U16 bitrateKHz) { U8 bitrate_div; // set i2c bitrate // calculate bitrate division bitrate_div = ((F_CPU/1000l)/bitrateKHz); if(bitrate_div >= 16) bitrate_div = (bitrate_div-16)/2; outb(TWBR, bitrate_div); }
////////////////////////////////////////////////////////////////////////////// /********************************************************************************************************** * 函数介绍: * 输入参数:-- * 输出参数:-- * 返 回 值:-- **********************************************************************************************************/ void i2cInit(void) {
// set i2c bit rate to 100KHz i2cSetBitrate(100); // enable TWI (two-wire interface) sbi(TWCR, TWEN); // set state // I2cState = I2C_IDLE; // enable TWI interrupt and slave address ACK sbi(TWCR, TWIE); sbi(TWCR, TWEA); //outb(TWCR, (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT)|BV(TWEA)); // enable interrupts SEI(); }
|
|