CS脚接高时表示使用I2C接口,接低时表示使用SPI接口。
使用I2C接口时,通信地址高6位是0b001100,第7位由SDO/SA0脚决定,接高电平时为1,接低电平时为0,第8位是读写标志位,读取时为1,写入时为0,地址组合关系如下:
测试I2C通信是否成功,可以读取0x0f寄存器,这个是LIS3DH的ID寄存器,值为0x33表示通信成功。
/* * CS=1, use I2C, CS=0, use SPI * on I2C mode, SDO=0, I2C addr is 0x31 & 0x30, SDO=1, addr is 0x33 & 0x32 */ #if 0 #define LIS3DH_I2C_ADD_READ 0x31U #define LIS3DH_I2C_ADD_WRITE 0x30U #else #define LIS3DH_I2C_ADD_READ 0x33U #define LIS3DH_I2C_ADD_WRITE 0x32U #endif #define LIS3DH_WHO_AM_I 0x0FU #define LIS3DH_ID 0x33U |
参考下代码:
void lis3dh_write_one_byte(uint8_t addr, uint8_t data) { iic_start(); iic_send_byte(LIS3DH_I2C_ADD_WRITE); iic_wait_ack(); iic_send_byte(addr); iic_wait_ack(); iic_send_byte(data); iic_wait_ack(); iic_stop(); delay_ms(10); } uint8_t lis3dh_read_one_byte(uint8_t addr) { iic_start(); iic_send_byte(LIS3DH_I2C_ADD_WRITE); iic_wait_ack(); iic_send_byte(addr); iic_wait_ack(); iic_start(); iic_send_byte(LIS3DH_I2C_ADD_READ); iic_wait_ack(); uint8_t data = iic_read_byte(0); iic_stop(); return data; } |