?? usb_to_i2c.c
字號:
/**************************************************************************
* Copyright (C) 2008 by Simon Qian *
* SimonQian@SimonQian.com *
* *
* Project: Versaloon *
* File: USB_TO_SPI.c *
* Author: SimonQian *
* Versaion: See changelog *
* Purpose: implementation file for USB_TO_SPI *
* License: See license *
*------------------------------------------------------------------------*
* Change Log: *
* YYYY-MM-DD: What(by Who) *
* 2008-11-07: created(by SimonQian) *
**************************************************************************/
#include "stdio.h"
#include "string.h"
#include "app_cfg.h"
#include "i2c_ee.h"
#include "hw_config.h"
#include "Usb_To_I2c.h"
//
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "platform_config.h"
#include "stm32f10x_it.h"
#include "usb_lib.h"
#include "usb_desc.h"
#define USB_DATA_SIZE VIRTUAL_COM_PORT_DATA_SIZE
unsigned long ulTimeOut_Time;
#define I2cConfigDebug 1
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Use the defines below the choose the EEPROM type */
//#define EE_M24C08 /* Support the device: M24C08. */
/* note: Could support: M24C01, M24C02, M24C04 and M24C16 if the blocks and
HW address are correctly defined*/
#define EE_M24C64_32 /* Support the devices: M24C32 and M24C64 */
/* Defines for the GPIO pins used for the I2C communication */
#define I2C_1 I2C1
#define I2C_1_CLK RCC_APB1Periph_I2C1
#define I2C_1_GPIO GPIOB
#define I2C_1_GPIO_CLK RCC_APB2Periph_GPIOB
#define I2C_1_SCL GPIO_Pin_6
#define I2C_1_SDA GPIO_Pin_7
#define I2C_2 I2C2
#define I2C_2_CLK RCC_APB1Periph_I2C2
#define I2C_2_GPIO GPIOB
#define I2C_2_GPIO_CLK RCC_APB2Periph_GPIOB
#define I2C_2_SCL GPIO_Pin_10
#define I2C_2_SDA GPIO_Pin_11
#if 0
/* Private define ------------------------------------------------------------*/
#define EEPROM_WriteAddress1 0x50
#define EEPROM_ReadAddress1 0x50
#define BufferSize1 (countof(Tx1_Buffer)-1)
#define BufferSize2 (countof(Tx2_Buffer)-1)
#define EEPROM_WriteAddress2 (EEPROM_WriteAddress1 + BufferSize1)
#define EEPROM_ReadAddress2 (EEPROM_ReadAddress1 + BufferSize1)
/* Private macro -------------------------------------------------------------*/
#define countof(a) (sizeof(a) / sizeof(*(a)))
/* Private variables ---------------------------------------------------------*/
uint8_t Tx1_Buffer[] = "/* STM32F10x I2C Firmware ";
uint8_t Tx2_Buffer[] = "Library Example */";
uint8_t Rx1_Buffer[BufferSize1], Rx2_Buffer[BufferSize2];
volatile TestStatus TransferStatus1 = FAILED, TransferStatus2 = FAILED;
#endif
void USB_I2C_TEST(void);
void USB_I2C_ReadTest(void);
void USB_I2C_Revert(Usb_Package_Header * Usbdata);
u8 USB_I2C_Configuration(I2C_Init_Parameter* I2C_Parameter);
void USB_I2C_WaitEepromStandbyState(unsigned char DevAddr);
u16 USB_I2C_Read(Usb_I2C_TRANSACTION* I2c_Data, u8* pBuffer);
void USB_I2C_ReqOut(u8 *data, u32 len);
/**
* @brief I2C Configuration
* @param None
* @retval None
*/
//void USB_I2C_Configuration(I2C_Init_Parameter* I2C_Parameter);
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
/* _Usb_Package_Header->bCmd in IIC Mode*/
/*
#define I2C_CMD_SCAN 0
#define I2C_CMD_START 1
#define I2C_CMD_RESTART 2
#define I2C_CMD_SOTP 3
#define I2C_CMD_ACK 4
#define I2C_CMD_READ 5
#define I2C_CMD_WRITE 6
//#define CMD_SOTP 7
*/
/**
* @brief I2C Configuration
* @param None
* @retval None
*/
u8 USB_I2C_Configuration(I2C_Init_Parameter* I2C_Parameter)
{
I2C_InitTypeDef I2C_InitStructure;
RCC_ClocksTypeDef Rcc_Clocks;
#if I2cConfigDebug
printf("\r\n\r\nI2c Setup:\r\n");
printf("\r\n I2C/SM Channels: %d Channels", I2C_Parameter->I2C_Channels);
#endif
/* I2C configuration */
/*
if(I2C_Parameter->I2C_Mode == 0x01){
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
printf("\r\n I2C/SM Mode: IIC Mode");
}else
*/
if(I2C_Parameter->I2C_Mode == 0x02){
I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusDevice;
#if I2cConfigDebug
printf("\r\n I2C/SM Mode: SM Bus Device");
#endif
}else if(I2C_Parameter->I2C_Mode == 0x03){
I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost;
#if I2cConfigDebug
printf("\r\n I2C/SM Mode: SM Bus Host");
#endif
}else{
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
#if I2cConfigDebug
printf("\r\n I2C/SM Mode: IIC Mode");
#endif
}
if(I2C_Parameter->I2C_DutyCycle == 0x02){
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
#if I2cConfigDebug
printf("\r\n I2C/SM Cycle: 2:1");
#endif
//}else if(I2C_Parameter->I2C_DutyCycle == 0x01) {
// I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;
// printf("\r\n Cycle: 16:9");
}else{
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;
#if I2cConfigDebug
printf("\r\n I2C/SM Cycle: 16:9");
#endif
}
if(I2C_Parameter->I2C_Ack == 0x01){
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
#if I2cConfigDebug
printf("\r\n I2C/SM Ack: Enable");
#endif
}else if(I2C_Parameter->I2C_Ack == 0x02){
I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
#if I2cConfigDebug
printf("\r\n I2C/SM Ack: Disable");
#endif
}
/*
if(I2C_Parameter->I2C_AcknowledgedAddress == 0x01){
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
printf("\r\n I2C/SM Addr Len: 7bit");
}else
*/
if(I2C_Parameter->I2C_AcknowledgedAddress == 0x02){
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_10bit;
#if I2cConfigDebug
printf("\r\n I2C/SM Addr Len: 10bit");
#endif
}else{
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
#if I2cConfigDebug
printf("\r\n I2C/SM Addr Len: 7bit");
#endif
}
I2C_InitStructure.I2C_OwnAddress1 = I2C_Parameter->I2C_OwnAddress1;
#if I2cConfigDebug
printf("\r\nI2C/SM SlaveAddr: 0x%x", I2C_Parameter->I2C_OwnAddress1);
#endif
I2C_InitStructure.I2C_ClockSpeed = (I2C_Parameter->I2C_ClockSpeed * 1000);
#if I2cConfigDebug
printf("\r\n I2C/SM Speed: %d kHz", I2C_Parameter->I2C_ClockSpeed);
#endif
if(I2C_Parameter->I2C_Channels == 0x02)
{
/* I2C Periph clock enable */
RCC_APB1PeriphClockCmd(I2C_2_CLK, ENABLE);
/* GPIO Periph clock enable */
RCC_APB2PeriphClockCmd(I2C_2_GPIO_CLK, ENABLE);
/* I2C Peripheral Enable */
I2C_Cmd(I2C_2, ENABLE);
/* Apply I2C configuration after enabling it */
I2C_Init(I2C_2, &I2C_InitStructure);
I2C_CalculatePEC(I2C2, ENABLE);
/* Enable I2C2 event and buffer interrupts */
I2C_ITConfig(I2C2, I2C_IT_EVT | I2C_IT_BUF, ENABLE);
}else{
/* I2C Periph clock enable */
RCC_APB1PeriphClockCmd(I2C_1_CLK, ENABLE);
/* GPIO Periph clock enable */
RCC_APB2PeriphClockCmd(I2C_1_GPIO_CLK, ENABLE);
/* I2C Peripheral Enable */
I2C_Cmd(I2C_1, ENABLE);
/* Apply I2C configuration after enabling it */
I2C_Init(I2C_1, &I2C_InitStructure);
}
//-------------------------------------------
// 超時時間計算(5ms 超時)
//-------------------------------------------
RCC_GetClocksFreq(&Rcc_Clocks);
ulTimeOut_Time = (Rcc_Clocks.SYSCLK_Frequency /10 *5 /1000); // 等待程序的執(zhí)行時間:10 個指令周期
#if I2cConfigDebug
printf("\r\n I2C/SM OverOut: %d", ulTimeOut_Time);
printf("\r\n\r\n");
#endif
return 1;
}
void USB_I2C_Revert(Usb_Package_Header* Usbdata)
{
u8 req_data[8];
memset(req_data, 0x00, 8); //clean buffer
req_data[0] = Usbdata->bType;
req_data[1] = Usbdata->bCmd;
*((unsigned short *)req_data + 1) = 0x0006; //succeed
*((unsigned short *)req_data + 2) = 0xA5A5; //succeed
UserToPMABufferCopy((unsigned char *)req_data, ENDP2_TXADDR, 8);
SetEPTxCount(ENDP2, 8);
SetEPTxValid(ENDP2);
}
void USB_I2C_ReqOut(u8 *data, u32 len)
{
u32 blocksize; //塊大小
u32 wbytes;
u8 * buffer = data;
wbytes = len;
while (wbytes) //循環(huán)寫完 到0字節(jié)
{
if (wbytes > USB_DATA_SIZE)
{
blocksize = USB_DATA_SIZE; //如果寫的塊大于200字節(jié),那么就寫200 否則寫當前所剩 字節(jié)數(shù)
wbytes -= USB_DATA_SIZE; //總的需要寫的數(shù)量減少200字節(jié)
}
else
{
blocksize = wbytes; //寫當前所剩字節(jié)數(shù)
wbytes = 0; //沒有要寫 的字節(jié)了
}
UserToPMABufferCopy(buffer, ENDP2_TXADDR, blocksize);
SetEPTxCount(ENDP2, blocksize);
SetEPTxValid(ENDP2);
buffer += blocksize;
}
}
void USB_TO_I2C_ProcessCmd(Usb_Package_Header *rxData)
{
u8 RxBuffer[256];
u16 RxLen;
memset(RxBuffer, 0x00, 256); //clean buffer
if(rxData->bCmd == I2C_CMD_CONFIG){
if(USB_I2C_Configuration((I2C_Init_Parameter *)((unsigned char *)rxData+ sizeof(Usb_Package_Header))))
{
USB_I2C_Revert(rxData);
}
}else if (rxData->bCmd == I2C_CMD_START){
/* Send STRAT condition */
I2C_GenerateSTART(I2C_1, ENABLE);
USB_I2C_Revert(rxData);
}else if (rxData->bCmd == I2C_CMD_SOTP){
/* Send STOP condition */
I2C_GenerateSTOP(I2C_1, ENABLE);
USB_I2C_Revert(rxData);
}else if (rxData->bCmd == I2C_CMD_READ){
//USB_I2C_ReadTest();
//USB_I2C_Revert(rxData);
RxLen = USB_I2C_Read((Usb_I2C_TRANSACTION *)((unsigned char *)rxData+ sizeof(Usb_Package_Header)), RxBuffer);
//printf("\r\nRead buffer count: %d", RxLen);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -