#include "stm32f4xx_rcc.c" #include "stm32f4xx_gpio.c" //#include "stm32f4xx_tim.c" #include "stm32f4xx_i2c.c" #include "LCD2x16.c" #include "dd.h" #define LIS_chip_I2C_address 0x1d void I2C1init(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); GPIOB->BSRRL = BIT_6 | BIT_7; // SDA, SCL -> hi GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // SDA, SCL def GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // alternate function GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // use open drain ! GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); // PB6:I2C1_SCL GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); // PB7:I2C1_SDA I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9; I2C_InitStructure.I2C_OwnAddress1 = 0; I2C_InitStructure.I2C_Ack = I2C_Ack_Disable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } char I2C_Write1Byte(char DeviceAddr, char addr, char byte1) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // wait if I2C1 is busy I2C_GenerateSTART(I2C1, ENABLE); // generate START while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // wait for EV5 I2C_Send7bitAddress(I2C1, (DeviceAddr << 1), I2C_Direction_Transmitter); // send device addr while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // wait for EV6 I2C_SendData(I2C1, addr); // addr within device while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); // wait for EV8 I2C_SendData(I2C1, byte1); // send actual data while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // wait for EV8_2 I2C_GenerateSTOP(I2C1, ENABLE); // generate STOP return (0); } char I2C_Write2Byte(char DeviceAddr, char addr, char byte1, char byte2) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // wait if I2C1 is busy I2C_GenerateSTART(I2C1, ENABLE); // generate START while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // wait for EV5 I2C_Send7bitAddress(I2C1, (DeviceAddr << 1) + 0x80, I2C_Direction_Transmitter); // send device addr, auto increment while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // wait for EV6 I2C_SendData(I2C1, addr); // addr within device while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); // wait for EV8 I2C_SendData(I2C1, byte1); // send actual data while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); // wait for EV8 I2C_SendData(I2C1, byte2); // send actual data while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // wait for EV8_2 I2C_GenerateSTOP(I2C1, ENABLE); // generate STOP return (0); } char I2C_Read1Byte(char DeviceAddr, char addr) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // wait if I2C1 is busy I2C_GenerateSTART(I2C1, ENABLE); // generate START while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // wait EV5 I2C_Send7bitAddress(I2C1, (DeviceAddr << 1), I2C_Direction_Transmitter); // send device addr while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // wait EV6 I2C_SendData(I2C1, addr); // addr within device while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // wait for EV8_2 I2C_GenerateSTART(I2C1, ENABLE); // generate START while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // wait EV5 I2C_Send7bitAddress(I2C1, (DeviceAddr << 1), I2C_Direction_Receiver); // send device addr while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // wait EV6 I2C_AcknowledgeConfig(I2C1, DISABLE); // do not acknowledge while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED) ); // wait EV7 char byte1 = I2C_ReceiveData(I2C1); // retrieve byte I2C_GenerateSTOP(I2C1, ENABLE); // generate STOP return (byte1); } short I2C_Read2Byte(char DeviceAddr, char addr) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // wait if I2C1 is busy I2C_GenerateSTART(I2C1, ENABLE); // generate START while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // wait EV5 I2C_Send7bitAddress(I2C1, (DeviceAddr << 1), I2C_Direction_Transmitter); // send device addr while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // wait EV6 I2C_SendData(I2C1, addr + 0x80); // addr within device, auto increment while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // wait for EV8_2 I2C_GenerateSTART(I2C1, ENABLE); // generate START while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // wait EV5 I2C_Send7bitAddress(I2C1, (DeviceAddr << 1), I2C_Direction_Receiver); // send device addr while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // wait EV6 I2C_AcknowledgeConfig(I2C1, ENABLE); // acknowledge 1st byte while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED) ); // wait EV7 char byte1 = I2C_ReceiveData(I2C1); // retrieve byte I2C_AcknowledgeConfig(I2C1, DISABLE); // do not acknowledge 2nd byte while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED) ); // wait EV7 char byte2 = I2C_ReceiveData(I2C1); // retrieve byte I2C_GenerateSTOP(I2C1, ENABLE); // generate STOP return ((byte2 << 8) + byte1); } void LIS_write (char addr, char data) { I2C_Write1Byte(LIS_chip_I2C_address, addr, data); } short LIS_read (char addr) { short x = I2C_Read1Byte (LIS_chip_I2C_address, addr); return (x); } short LIS_read_2bytes (char addr) { short x = I2C_Read2Byte (LIS_chip_I2C_address, addr); return (x); } int main () { //short unsigned ii = 0; I2C1init(); // I2C1 init LCD_init(); // Init LCD LCD_string("I2C demo Z", 0); // write title LCD_string("X Y", 0x40); // write title LIS_write (0x20,0xc7); // waste time - indefinite while (1) { /* short xLSB = LIS_read(0x28); short xMSB = LIS_read(0x29) << 8; short yLSB = LIS_read(0x2a); short yMSB = LIS_read(0x2b) << 8; short zLSB = LIS_read(0x2c); short zMSB = LIS_read(0x2d) << 8; LCD_sInt16((xLSB + xMSB), 0x41, 0x01); // show acc x LCD_sInt16((yLSB + yMSB), 0x4a, 0x01); // show acc y LCD_sInt16((zLSB + zMSB), 0x0a, 0x01); // show acc z */ LCD_sInt3DG(LIS_read_2bytes(0x28), 0x41, 0x01); // show acc x LCD_sInt4DG(LIS_read_2bytes(0x2a), 0x4a, 0x01); // show acc y LCD_sInt4DG(LIS_read_2bytes(0x2c), 0x0a, 0x01); // show acc z for (int i = 0; i < 10000000; i++) {}; // waste time }; }