📄 cs1100.c
字号:
#include "l1audio_def.h"
#if defined(CS1100)
// The following GPIO should be customized according to different platforms
extern const char gpio_fm_i2c_sda_pin;
extern const char gpio_fm_i2c_scl_pin;
#define SDA gpio_fm_i2c_sda_pin /// I2C data pin
#define SCL gpio_fm_i2c_scl_pin /// I2C clock pin
#define CRYCLK 2
#define CLKMOD 5
#define I2C_DELAY 32
#define OUTPUT 1
#define INPUT 0
#define SET_FM_I2C_DATA_OUTPUT GPIO_InitIO(OUTPUT, SDA);
#define SET_FM_I2C_DATA_INPUT GPIO_InitIO(INPUT,SDA);
#define SET_FM_I2C_CLK_OUTPUT GPIO_InitIO(OUTPUT, SCL);
#define SET_FM_I2C_DATA_HIGH GPIO_WriteIO(1,SDA);
#define SET_FM_I2C_DATA_LOW GPIO_WriteIO(0,SDA);
#define SET_FM_I2C_CLK_HIGH GPIO_WriteIO(1,SCL);
#define SET_FM_I2C_CLK_LOW GPIO_WriteIO(0,SCL);
#define GET_FM_I2C_DATA GPIO_ReadIO(SDA)
void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
void GPO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
void GPIO_InitIO(char direction, char port);
void GPIO_WriteIO(char data,char port);
char GPIO_ReadIO(char port);
uint8 const FM_RADIO_INPUT_LEVEL_THRESHOLD = 3;
void SerialCommStart(void) /* start or re-start */
{
volatile kal_uint32 j;
SET_FM_I2C_CLK_OUTPUT;
SET_FM_I2C_DATA_OUTPUT;
SET_FM_I2C_CLK_HIGH;
SET_FM_I2C_DATA_HIGH;
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_DATA_LOW;
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_CLK_LOW;
}
void SerialCommStop(void)
{
volatile kal_uint32 j;
SET_FM_I2C_CLK_OUTPUT;
SET_FM_I2C_DATA_OUTPUT;
SET_FM_I2C_CLK_LOW;
SET_FM_I2C_DATA_LOW;
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_CLK_HIGH;
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_DATA_HIGH;
}
uint8 SerialCommTxByte(uint8 data) /* return 0 --> ack */
{
volatile signed char i;
volatile kal_uint32 j;
uint8 ack;
for (i=7;i>=0;i--)
{
if (data & (1<<i))
{
SET_FM_I2C_DATA_HIGH;
}
else
{
SET_FM_I2C_DATA_LOW;
}
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_CLK_HIGH;
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_CLK_LOW;
for(j=0;j<I2C_DELAY;j++);
}
/* don't care bit, 9th bit */
SET_FM_I2C_DATA_LOW;
SET_FM_I2C_DATA_INPUT;
SET_FM_I2C_CLK_HIGH;
ack = GET_FM_I2C_DATA;
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_CLK_LOW;
SET_FM_I2C_DATA_OUTPUT;
return ack;
}
void SerialCommRxByte(uint8 *data, uint8 ack)
{
volatile signed char i;
volatile kal_uint32 j;
kal_uint8 get_byte=0;
SET_FM_I2C_DATA_INPUT;
for (i=7;i>=0;i--)
{ /* data bit 7~0 */
SET_FM_I2C_CLK_HIGH;
for(j=0;j<I2C_DELAY;j++);
if (GET_FM_I2C_DATA)
get_byte |= (1<<i);
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_CLK_LOW;
for(j=0;j<I2C_DELAY;j++);
}
/* don't care bit, 9th bit */
SET_FM_I2C_DATA_OUTPUT;
if(ack)
{
SET_FM_I2C_DATA_HIGH;
}
else
{
SET_FM_I2C_DATA_LOW;
}
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_CLK_HIGH;
for(j=0;j<I2C_DELAY;j++);
SET_FM_I2C_CLK_LOW;
*data=get_byte;
}
void SerialCommInit(void)
{
GPIO_ModeSetup(SCL,0);
GPIO_ModeSetup(SDA,0);
SET_FM_I2C_CLK_OUTPUT;
}
void SerialCommRelease(void)
{
GPIO_WriteIO(1,SCL);
GPIO_WriteIO(1,SDA);
}
void SerialCommCryClkOn(void)
{
extern const char gpio_fm_srclkena_pin;
GPIO_ModeSetup(gpio_fm_srclkena_pin,2); // set clock mode
GPIO_SetClkOut(CLKMOD,4); //set to clock 32.768KHz
//GPO_ModeSetup(CRYCLK,2); // 32.768kHz reference frequency
}
void SerialCommCryClkOff(void)
{
// GPO_ModeSetup(CRYCLK,0);
extern const char gpio_fm_srclkena_pin;
GPO_ModeSetup(gpio_fm_srclkena_pin, 1);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -