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