STM32初学者笔记(12) 一步步建立自己的STM32函数
I2C的函数,初步。
//==========================================================================//
//
// 如果ChipID的LSB=0 是读,LSB=1是写,
//==========================================================================//
void SetCurrentAddress(unsigned char ChipID, unsigned short Address)
{
STM32_I2c1_Regs->cr1.bit.PE=0; // 0:禁用I2C外设 ,同时硬件清零某些标志位
STM32_I2c1_Regs->cr1.bit.PE=0; // 0:禁用I2C外设 ,同时硬件清零某些标志位
STM32_I2c1_Regs->cr1.bit.PE=1; // 1:启用I2C外设
STM32_I2c1_Regs->cr1.bit.PE=1; // 1:启用I2C外设
//I2C_AcknowledgeConfig(I2C1, ENABLE);//ACK=1;
STM32_I2c1_Regs->cr1.bit.ACK=1; // ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
//I2C_GenerateSTART(I2C1, ENABLE);//START=1
STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_START;
// 【SB=1 起始条件已发送 读SR1,然后写数据DR 清零 】 MSL=1主模式 BUSY=1 在总线上正在进行数据通讯 )
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
//I2C_Send7bitAddress(I2C1, ChipID, I2C_Direction_Transmitter); //I2Cx->DR = Addr;
STM32_I2c1_Regs->dr.all=ChipID;
// 【ADDR=1 地址发送结束;读SR1和SR2来清零 】。 TXE=1 数据寄存器空 MSL=1 BUSY=1, TRA=1 数据已发送
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//I2C_SendData(I2C1, (u8)nAddr);//I2Cx->DR = nAddr;
STM32_I2c1_Regs->dr.all=(u8)Address;
// 【TXE=1 数据寄存器空; 写数据DR清除,START,STOP】 BTF=1: 字节发送结束 TRA=数据已发送 BUSY=在总线上正在进行数据通讯 MSL=主模式
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}//END SetCurrentAddress
//==========================================================================//
void SendI2CAck(void)
{
//I2C_AcknowledgeConfig(I2C1, ENABLE);//ACK=1;
STM32_I2c1_Regs->cr1.bit.ACK=1; // ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
}//end
//==========================================================================//
void SendI2CNAck(void)
{
//I2C_AcknowledgeConfig(I2C1, DISABLE);//ACK=1;
STM32_I2c1_Regs->cr1.bit.ACK=0; // ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
}//end
//==========================================================================
//
//==========================================================================
void StartI2C(void)
{
STM32_I2c1_Regs->cr1.bit.PE=0; // 0:禁用I2C外设 ,同时硬件清零某些标志位
STM32_I2c1_Regs->cr1.bit.PE=0; // 0:禁用I2C外设 ,同时硬件清零某些标志位
STM32_I2c1_Regs->cr1.bit.PE=1; // 1:启用I2C外设
STM32_I2c1_Regs->cr1.bit.PE=1; // 1:启用I2C外设
//I2C_GenerateSTART(I2C1, ENABLE);// START=1
STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_START;
// 【SB=1 起始条件已发送 ; 读SR1,然后写数据DR 清零 】 MSL=1主模式 BUSY=1 在总线上正在进行数据通讯 )
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
}//end sub
//==========================================================================
//
//==========================================================================
void StopI2C(void)
{
//I2C_GenerateSTOP(I2C1, ENABLE);
STM32_I2c1_Regs->cr1.all|= I2C_EN|I2C_STOP;
while(STM32_I2c1_Regs->sr2.bit.MSL); // 0:从模式
}//end sub
//==========================================================================
//
//==========================================================================
void SendAByte(uint8 data)
{
//I2C_SendData(I2C1, pDat);
STM32_I2c1_Regs->dr.all=data;
//I2C_AcknowledgeConfig(I2C1, ENABLE);//ACK=1;
STM32_I2c1_Regs->cr1.bit.ACK=1; // ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
// 【TXE=1 数据寄存器空; 写数据DR清除,START,STOP】 BTF=1: 字节发送结束 TRA=数据已发送 BUSY=在总线上正在进行数据通讯 MSL=主模式
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}//end sub
//==========================================================================
//
//==========================================================================
uint8 ReadAByte_ACK(void)
{
uint8 data=0;
//I2C_AcknowledgeConfig(I2C1, ENABLE);//ACK=1;
STM32_I2c1_Regs->cr1.bit.ACK=1; // ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
// 【RXNE=1 数据寄存器非空; 读写DR清零 】 BUSY=1 在总线上正在进行数据通讯 MSL=1 主模式
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
data = STM32_I2c1_Regs->dr.all;
return(data);
}//end sub
//==========================================================================
//
//==========================================================================
uint8 ReadAByte_NOACK(void)
{
uint8 data=0;
//I2C_AcknowledgeConfig(I2C1, ENABLE);//ACK=1;
STM32_I2c1_Regs->cr1.bit.ACK=0; // ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
// 【RXNE=1 数据寄存器非空; 读写DR清零 】 BUSY=1 在总线上正在进行数据通讯 MSL=1 主模式
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
data = STM32_I2c1_Regs->dr.all;
return(data);
}//end sub
// 只写低8位
//==========================================================================
//
//==========================================================================
void WriteAByte(uint8 data)
{
//I2C_AcknowledgeConfig(I2C1, ENABLE);//ACK=1;
STM32_I2c1_Regs->cr1.bit.ACK=1; // ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据)
STM32_I2c1_Regs->dr.all=data;
// 【TXE=1 数据寄存器空 ;写数据DR清除,START,STOP】 BTF=1: 字节发送结束 TRA=数据已发送 BUSY=在总线上正在进行数据通讯 MSL=主模式
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}//end sub
|