MoistureSoftware/Source/i2c.c

352 lines
8.9 KiB
C
Raw Permalink Normal View History

2025-09-28 09:17:22 +00:00
#include "BSP.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
//===============================================================================
/********************************** <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> ***********************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
#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: /<2F><>\__
// SCL: /<2F><><EFBFBD><EFBFBD>\__
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: \__/<2F><>
// SCL: \__/<2F><>
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);
}
// <20><><EFBFBD><EFBFBD>ACKӦ<4B><D3A6>
void I2C_ACK()
{
// SDA: \________
// SCL: \__/<2F><>\__
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);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ACKӦ<4B><D3A6>
void I2C_NACK()
{
// SDA: /<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// SCL: \__/<2F><>\__
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);
}
// <20>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>źŵ<C5BA><C5B5><EFBFBD>
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ʧ<EFBFBD><CAA7>
// 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ɹ<EFBFBD>
uint8_t I2C_Wait_ACK()
{
uint8_t timeOut = 0;
// SDA: /<2F><> X
// SCL: --/<2F><><EFBFBD><EFBFBD>\__
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<49><43><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
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;
}
}
// <20><>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD>
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(); // <20><><EFBFBD><EFBFBD>nACK
else
I2C_ACK(); // <20><><EFBFBD><EFBFBD>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);
}
// <20><><EFBFBD><EFBFBD>ACKӦ<4B><D3A6>
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);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ACKӦ<4B><D3A6>
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);
}
// <20>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>źŵ<C5BA><C5B5><EFBFBD>
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ʧ<EFBFBD><CAA7>
// 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ɹ<EFBFBD>
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(); // <20><><EFBFBD><EFBFBD>nACK
else
I2C2_ACK(); // <20><><EFBFBD><EFBFBD>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 */