stm32f103VE利用iic如和对ili9341写命令、写数据、读数据(使用固件库编程)
时间: 2023-09-11 16:05:08 浏览: 183
### 回答1:
下面是基于STM32F103VE的I2C接口与ILI9341液晶屏进行通信的代码示例,使用的是STM32固件库。
注意,本示例中使用的I2C地址为0x38,如果你的液晶屏I2C地址不同,需要根据实际情况进行修改。
```c
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_i2c.h"
#define I2C_Speed 400000
#define I2C_DevAddress 0x38
#define ILI9341_CMD 0x00
#define ILI9341_DATA 0x40
void I2C_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
void I2C_StartTransmission(uint8_t transmissionDirection)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, I2C_DevAddress, transmissionDirection);
if(transmissionDirection == I2C_Direction_Transmitter)
{
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
}
else if(transmissionDirection == I2C_Direction_Receiver)
{
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
}
}
void I2C_WriteData(uint8_t data)
{
I2C_SendData(I2C1, data);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
uint8_t I2C_ReadData(void)
{
uint8_t data;
I2C_AcknowledgeConfig(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
data = I2C_ReceiveData(I2C1);
return data;
}
void ILI9341_WriteCommand(uint8_t command)
{
I2C_StartTransmission(I2C_Direction_Transmitter);
I2C_WriteData(ILI9341_CMD);
I2C_WriteData(command);
I2C_GenerateSTOP(I2C1, ENABLE);
}
void ILI9341_WriteData(uint8_t data)
{
I2C_StartTransmission(I2C_Direction_Transmitter);
I2C_WriteData(ILI9341_DATA);
I2C_WriteData(data);
I2C_GenerateSTOP(I2C1, ENABLE);
}
uint8_t ILI9341_ReadData(void)
{
uint8_t data;
I2C_StartTransmission(I2C_Direction_Receiver);
data = I2C_ReadData();
I2C_GenerateSTOP(I2C1, ENABLE);
return data;
}
int main(void)
{
I2C_Configuration();
// 设置液晶屏的像素格式
ILI9341_WriteCommand(0x3A); // 设置像素格式命令
ILI9341_WriteData(0x55); // 16 bits/pixel
// 设置液晶屏的显示方向为横向
ILI9341_WriteCommand(0x36); // 设置显示方向命令
ILI9341_WriteData(0x48); // 横向
// 在液晶屏上画一个矩形
ILI9341_WriteCommand(0x2A); // 设置列地址命令
ILI9341_WriteData(0x00); // 起始列地址
ILI9341_WriteData(0x00); // 起始列地址
ILI9341_WriteData(0x00); // 结束列地址
ILI9341_WriteData(0xEF); // 结束列地址
ILI9341_WriteCommand(0x2B); // 设置行地址命令
ILI9341_WriteData(0x00); // 起始行地址
ILI9341_WriteData(0x00); // 起始行地址
ILI9341_WriteData(0x01); // 结束行地址
ILI9341_WriteData(0x3F); // 结束行地址
ILI9341_WriteCommand(0x2C); // 写数据命令
for(int i = 0; i < 240 * 320; i++)
{
ILI9341_WriteData(0xF800); // 红色像素点
}
while(1);
}
```
上述代码中,首先通过`I2C_Configuration()`函数对I2C接口进行初始化配置,然后通过`ILI9341_WriteCommand()`和`ILI9341_WriteData()`函数分别向液晶屏发送命令和数据,最后在屏幕上画一个红色矩形。
如果需要读取液晶屏的数据,可以使用`ILI9341_ReadData()`函数。需要注意的是,读取数据时需要先发送读命令,然后再读取数据。
以上代码仅供参考,具体的实现需要根据你的具体需求进行修改。
### 回答2:
stm32f103VE是一款基于ARM Cortex-M3内核的微控制器,可通过IIC总线与ili9341液晶屏进行通信。下面是利用固件库编程实现ili9341的写命令、写数据和读数据的步骤:
1. 初始化IIC总线:配置IIC时钟、GPIO引脚等参数,并使能IIC外设。
2. 写命令:当需要向ili9341发送命令时,首先向IIC外设发送开始信号(START),然后发送ili9341的IIC地址以及写命令(通常是0x00)。
3. 写数据:要向ili9341写入数据时,首先向IIC外设发送开始信号(START),然后发送ili9341的IIC地址以及写数据命令(通常是0x40),最后发送要写入的数据。
4. 读数据:需要从ili9341读取数据时,首先向IIC外设发送开始信号(START),然后发送ili9341的IIC地址,接着发送读数据命令(通常是0x41),最后才能读取ili9341返回的数据。
需要注意的是,每次向ili9341发送命令或数据时,都需要通过IIC总线发送起始信号(START)和停止信号(STOP)来标识一个传输周期的开始和结束。
在具体的编程实现中,可以利用stm32f103VE的外设库提供的函数来完成IIC的初始化、发送数据和接收数据的操作。可以参考相关的固件库文档来了解具体的函数调用接口和示例代码。
使用固件库编程,能够更加方便地完成stm32f103VE与ili9341之间的数据传输,提高代码的可读性和可维护性。
### 回答3:
在STM32F103VE上利用I2C与ILI9341通信,可以使用固件库进行编程。具体步骤如下:
1. 配置I2C总线:首先需要配置I2C总线的时钟频率、GPIO引脚、地址模式等。可以使用库函数`I2C_Init()`完成配置。
2. 发送写命令:通过I2C总线发送命令给ILI9341。ILI9341的写命令是通过DC(或RS)引脚的高低电平来区分的,所以需要先设置DC引脚为低电平,然后将命令发送到ILI9341的I2C地址。可以使用库函数`I2C_GenerateSTART()`、`I2C_Send7bitAddress()`、`I2C_SendData()`等实现。
3. 发送写数据:通过I2C总线发送数据给ILI9341。写数据与写命令类似,只需将DC引脚设置为高电平,然后将数据发送到ILI9341的I2C地址即可。
4. 读数据:在STM32F103VE上通过I2C读取ILI9341的数据可以采用读命令的方式。首先发送读命令到ILI9341,然后通过I2C接收数据。可以使用库函数`I2C_GenerateSTART()`、`I2C_Send7bitAddress()`、`I2C_SendData()`、`I2C_GenerateSTOP()`、`I2C_ReceiveData()`等实现。
需要注意的是,在进行I2C通信时,需要先初始化I2C总线并设置正确的时钟频率、地址模式等。另外,还需要根据ILI9341的通信协议编写相关的命令和数据发送函数。
阅读全文