196 lines
4.5 KiB
C
196 lines
4.5 KiB
C
/********************************************************************************
|
||
* 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);
|
||
|
||
}
|