MoistureSoftware/Source/i2c.c

352 lines
8.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "BSP.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
//===============================================================================
/********************************** 功能说明 ***********************************
* 访问I2C总线
*******************************************************************************/
#define PinBB(_Port, _Num) (*(__IO int32_t *)(PERIPH_BB_BASE + ((uint32_t) & (_Port)-PERIPH_BASE) * 32u + (_Num)*4u))
/* USER CODE BEGIN 1 */
#define I2C_SCL_PIN GPIO_Pin_4
#define I2C_SCL_GPIO GPIOB
#define I2C_SDA_PIN GPIO_Pin_5
#define I2C_SDA_GPIO GPIOB
extern void delay_us(uint32_t us);
void I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
GPIO_SetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
}
void I2C_Start(void)
{
// SDA: / ̄\__
// SCL: / ̄ ̄\__
GPIO_SetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
GPIO_SetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
delay_us(1);
GPIO_ResetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
delay_us(1);
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
// delay_us(1);
}
void I2C_Stop(void)
{
// SDA: \__/ ̄
// SCL: \__/ ̄
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
GPIO_ResetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
GPIO_SetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
}
// 产生ACK应答
void I2C_ACK()
{
// SDA: \________
// SCL: \__/ ̄\__
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
GPIO_ResetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
delay_us(1);
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
}
// 不产生ACK应答
void I2C_NACK()
{
// SDA: / ̄ ̄ ̄ ̄
// SCL: \__/ ̄\__
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
GPIO_SetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
delay_us(1);
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
}
// 等待应答信号到来
// 返回值1接收应答失败
// 0接收应答成功
uint8_t I2C_Wait_ACK()
{
uint8_t timeOut = 0;
// SDA: / ̄ X
// SCL: --/ ̄ ̄\__
GPIO_SetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
delay_us(1);
while (GPIO_ReadInputDataBit(I2C_SDA_GPIO, I2C_SDA_PIN)) {
delay_us(1); //
timeOut++;
if (timeOut > 250) {
I2C_Stop();
return 1;
}
}
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
return 0;
}
// IIC发送一个字节
void I2C_SendByte(uint8_t byte)
{
uint8_t i;
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
delay_us(1);
for (i = 0; i < 8; i++) {
if (byte & 0x80)
GPIO_SetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
else
GPIO_ResetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
delay_us(1);
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
byte <<= 1;
}
}
// 读1个字节
uint8_t I2C_ReadByte(uint8_t ack)
{
uint8_t i;
uint8_t byte = 0;
GPIO_SetBits(I2C_SDA_GPIO, I2C_SDA_PIN);
delay_us(1);
for (i = 0; i < 8; i++) {
GPIO_ResetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
delay_us(1);
byte <<= 1;
GPIO_SetBits(I2C_SCL_GPIO, I2C_SCL_PIN);
if (GPIO_ReadInputDataBit(I2C_SDA_GPIO, I2C_SDA_PIN))
byte |= 0x01;
delay_us(1);
}
if (!ack)
I2C_NACK(); // 发送nACK
else
I2C_ACK(); // 发送ACK
return byte;
}
#define I2C2_SCL_PIN GPIO_Pin_8
#define I2C2_SCL_GPIO GPIOB
#define I2C2_SDA_PIN GPIO_Pin_9
#define I2C2_SDA_GPIO GPIOB
void I2C2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = I2C2_SCL_PIN | I2C2_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
GPIO_SetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
}
void I2C2_Start(void)
{
GPIO_SetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
GPIO_SetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
GPIO_ResetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
delay_us(1);
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
}
void I2C2_Stop(void)
{
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
GPIO_ResetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
GPIO_SetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
}
// 产生ACK应答
void I2C2_ACK()
{
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
GPIO_ResetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
}
// 不产生ACK应答
void I2C2_NACK()
{
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
GPIO_SetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
}
// 等待应答信号到来
// 返回值1接收应答失败
// 0接收应答成功
uint8_t I2C2_Wait_ACK()
{
uint8_t timeOut = 0;
GPIO_SetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
while (GPIO_ReadInputDataBit(I2C2_SDA_GPIO, I2C2_SDA_PIN)) {
delay_us(1); //
timeOut++;
if (timeOut > 250) {
I2C2_Stop();
return 1;
}
}
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
return 0;
}
void I2C2_SendByte(uint8_t byte)
{
uint8_t i;
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
for (i = 0; i < 8; i++) {
if (byte & 0x80)
GPIO_SetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
else
GPIO_ResetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
delay_us(1);
GPIO_SetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
byte <<= 1;
}
}
uint8_t I2C2_ReadByte(uint8_t ack)
{
uint8_t i;
uint8_t byte = 0;
GPIO_SetBits(I2C2_SDA_GPIO, I2C2_SDA_PIN);
for (i = 0; i < 8; i++) {
GPIO_ResetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
byte <<= 1;
GPIO_SetBits(I2C2_SCL_GPIO, I2C2_SCL_PIN);
delay_us(1);
if (GPIO_ReadInputDataBit(I2C2_SDA_GPIO, I2C2_SDA_PIN))
byte |= 0x01;
}
if (!ack)
I2C2_NACK(); // 发送nACK
else
I2C2_ACK(); // 发送ACK
return byte;
}
#define Pin_I2C_STB1_Out PinBB(GPIOA->ODR, 12U)
// #define Pin_I2C_STB2_Out PinBB(GPIOG->ODR, 12U)
#define Pin_I2C_SCL_In PinBB(GPIOB->IDR, 6U)
#define Pin_I2C_SCL_Out PinBB(GPIOB->ODR, 6U)
#define Pin_I2C_SDA_In PinBB(GPIOB->IDR, 7U)
#define Pin_I2C_SDA_Out PinBB(GPIOB->ODR, 7U)
/* USER CODE BEGIN 1 */
void WS100T10_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_ResetBits(GPIOA, GPIO_Pin_15);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
Pin_I2C_SCL_Out = 1;
Pin_I2C_SDA_Out = 1;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void WS100T10_Ctrl(uint8_t OutByte)
{
uint8_t i, DataH, DataL;
uint16_t Data;
// if ((Channel == 1) || (Channel == 2)) {
// Pin_I2C_STB1_Out = 0;
// Pin_I2C_STB2_Out = 1;
// } else {
// Pin_I2C_STB1_Out = 1;
// Pin_I2C_STB2_Out = 0;
// }
// if ((Channel == 2) || (Channel == 4))
// DataH |= 0x80u;
DataH = OutByte;
DataL = ~DataH;
Data = DataL;
Data |= (DataH << 8);
Pin_I2C_STB1_Out = 0;
delay_us(300);
for (i = 16U; i != 0U; --i) {
Pin_I2C_SCL_Out = 0;
delay_us(100);
if (Data & 0x8000u) {
Pin_I2C_SDA_Out = 1;
} else {
Pin_I2C_SDA_Out = 0;
}
delay_us(300);
Data <<= 1;
Pin_I2C_SCL_Out = 1;
delay_us(300);
}
Pin_I2C_SDA_Out = 1;
// Pin_I2C_STB1_Out = 1;
Pin_I2C_SCL_Out = 1;
delay_us(300);
}
/* USER CODE END 1 */