TMC32_QJB/IIC/iic_main.c
2026-04-30 16:23:12 +08:00

196 lines
4.5 KiB
C
Raw 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.

/********************************************************************************
* Copyright (c) 2012, Beijing Tongfang Microelectroics Co., Ltd.
* All rights reserved.
* Module: I2C
* Author: yanghf
* Version: V1.0
* History:
* 2016-05-22 Original version
********************************************************************************/
#include "global.h"
uint8_t I2C2_RevBuff[100];
uint8_t I2C2_RevCnt = 0;
uint8_t I2C2_RevState = 0; // 0:未开始, 1:接收到start, 2:接收数据中, 3:接收到stop.
void AppIICSlaveInit(void)
{
GPIO_InitTypeDef GPIO_IIC_Init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_I2C,ENABLE); /* Open I2C clock */
GPIO_IIC_Init.Pin = GPIO_PIN_13|GPIO_PIN_14; /*选择GPIO*/
GPIO_IIC_Init.Pull = GPIO_NOPULL; /*选择GPIO 不上拉 不下拉 I2C的SDA 和SCL 需要外加上拉电阻*/
GPIO_IIC_Init.Mode = GPIO_MODE_AF; /*选择GPIO 的模式 AF*/
GPIO_IIC_Init.Speed = GPIO_HIGH_SPEED; /*设置GPIO的驱动能力 */
GPIO_Init(GPIOC, &GPIO_IIC_Init); /*设置GPIOC的初始化*/
GPIO_PinAFConfig(GPIOC, GPIO_PIN_Source13, GPIO_AF4_I2C); /*设置GPIOB_5的AF 模式 为AF1*/
GPIO_PinAFConfig(GPIOC, GPIO_PIN_Source14, GPIO_AF4_I2C); /*设置GPIOB_6的AF 模式 为AF1*/
IIC_Slave_CFG(I2C,I2C_CTRL_SCLCLOCK_PCLK_256,0x28); //0x01(设置slave 时的 地址值)
I2C->MSK = 0;
I2C->CON |= I2C_CTRL_AA_MASK;
I2C->CON &= ~I2C_CTRL_SI_MASK;
NVIC_ClearPendingIRQ(I2C_IRQn);
NVIC_EnableIRQ(I2C_IRQn);
}
/***************************************************************************
* Function: I2C_Init
* Description: I2C init
* Input:
1)I2Cx:
I2C1
I2C2
2)clock_speed
I2C_CTRL_SCLCLOCK_PCLK_256
I2C_CTRL_SCLCLOCK_PCLK_224
I2C_CTRL_SCLCLOCK_PCLK_192
I2C_CTRL_SCLCLOCK_PCLK_160
I2C_CTRL_SCLCLOCK_PCLK_960
I2C_CTRL_SCLCLOCK_PCLK_120
I2C_CTRL_SCLCLOCK_PCLK_60
I2C_CTRL_SCLCLOCK_BCLK_8
3)ser_addess address in slave mode
* Output: NULL
* Return: void
* Other: NULL
**************************************************************************/
void IIC_Slave_CFG(I2C_TypeDef* I2Cx, uint8_t clock_speed,uint8_t ser_address)
{
I2Cx->CON &= ~I2C_CTRL_ENS1_MASK; /* Reset I2C hardware. */
I2Cx->CON = I2C_CTRL_ENS1_MASK | clock_speed; /* set enable bit and clock_speed*/
I2Cx->ADDR0 = ser_address<<1;
}
/***************************************************************************
* Function: I2C_Slave_ReceiveBytes
* Description: receive bytes in slave mode
* Input:
1)I2Cx:
I2C1
I2C2
2)bytes receive bytes
3)lens
* Output: NULL
* Return: void
* Other: NULL
**************************************************************************/
void I2C_Slave_ReceiveBytes(I2C_TypeDef* I2Cx,uint8_t *bytes,uint16_t lens)
{
uint8_t status;
uint16_t i;
I2Cx->CON |= I2C_CTRL_AA_MASK;
I2Cx->CON &= ~I2C_CTRL_SI_MASK;
while(1)
{
status = I2Cx->STS;
if((status == STAT_SLAVE_SLAW) || (status == STAT_GCA))
break;
}
for(i=0;i<lens;i++)
{
I2Cx->CON |= I2C_CTRL_AA_MASK;
I2Cx->CON &= ~I2C_CTRL_SI_MASK;
while(1)
{
status = I2Cx->STS;
if((status == STAT_RDATA) || (status == STAT_GCA_ACK))
break;
}
bytes[i] = I2Cx->DATA;
}
I2Cx->CON &= ~I2C_CTRL_SI_MASK;
while(1)
{
status = I2Cx->STS;
if(status == STAT_RSTOP)
break;
}
I2Cx->CON |= I2C_CTRL_AA_MASK;
I2Cx->CON &= ~I2C_CTRL_SI_MASK;
status = I2Cx->STS;
}
/***************************************************************************
* Function: I2C_Slave_SendBytes
* Description: send bytes in slave mode
* Input:
1)I2Cx:
I2C1
I2C2
2)bytes send bytes
3)lens
* Output: NULL
* Return: void
* Other: NULL
**************************************************************************/
void I2C_Slave_SendBytes(I2C_TypeDef* I2Cx,uint8_t *bytes,uint16_t lens)
{
uint8_t status;
uint16_t i;
I2Cx->CON |= I2C_CTRL_AA_MASK;
I2Cx->CON &= ~I2C_CTRL_SI_MASK;
//TMC_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
GPIO_ResetBits(GPIOC,GPIO_PIN_8);
while(1)
{
status = I2Cx->STS;
if(status == STAT_SLAVE_SLAR_ACK)
break;
}
//bytes
for(i=0;i<lens;i++)
{
if((i+1) >= lens) //bytes+NAK
{
I2Cx->DATA = bytes[i];
I2Cx->CON &= ~I2C_CTRL_AA_MASK;
I2Cx->CON &= ~I2C_CTRL_SI_MASK;
while(1)
{
status = I2Cx->STS;
if((status == STAT_SLAVE_RNACK)||(status == STAT_FINAL))
{
I2Cx->CON |= I2C_CTRL_AA_MASK;
I2Cx->CON &= ~I2C_CTRL_SI_MASK;
break;
}
}
}
else //bytes+ACK
{
I2Cx->DATA = bytes[i];
I2Cx->CON &= ~I2C_CTRL_SI_MASK;
while(1)
{
status = I2Cx->STS;
if(status == STAT_RACK)
{
break;
}
}
}
}
GPIO_SetBits(GPIOC,GPIO_PIN_8);
NVIC_ClearPendingIRQ(I2C_IRQn);
NVIC_EnableIRQ(I2C_IRQn);
}