352 lines
8.9 KiB
C
352 lines
8.9 KiB
C
|
|
|
|||
|
|
#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 */
|