Master :STM32F030C8T6 slave :BS8116A-3 透过I2C传输
请教各位前辈 小弟在做BS8116A-3 initial时卡在下面(红色)这一行就不会往下跑了,很苦脑../* BS8116A-3 write setting Register */
I2C_TransferHandling(I2C1, 0x50, 22, I2C_Reload_Mode,I2C_Generate_Start_Read);
(ochar('a'));
I2C_SendData(I2C1, 0xB0);
(ochar('g'));
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)==RESET );
(ochar('b'));
I2C_SendData(I2C1, 0x00); //Option1
(ochar('c'));
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE)==RESET );
(ochar('d'));
I2C_SendData(I2C1, 0x00); //Reserve
(ochar('e'));
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) ==RESET);
(ochar('f'));
I2C_SendData(I2C1, 0x83); //Reserve
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0xF3); //Reserve
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x98); //Option2
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K1_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K2_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K3_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K4_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K5_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K6_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K7_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K8_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K9_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K10_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K11_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K12_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K13_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K14_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K15_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K16_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0xEE); //checksum(get low byte)
(ochar('z'));
完整程式如下
======================================================================
/* code */
#include "firmware.h"
#include "flags.h"
my_ubyte GlobeOption[ ]; // jimmyadd
my_ubyte flag;
volatile my_uint32 tmcount;
volatile uarts uart;
my_uint32 buzzer_count;
static USART_InitTypeDef USART_InitStructure;
static void InitPortA(void);
static void InitPortB(void);
static void InitSysTick(void);
static void Init_NVICSetup(void);
static voidInit_BS8116A_3(void); //jimmy add
void InitialGlobal(void); // jimmyadd
static void Init_UART0Config(void);
void I2C1_Write(unsigned char data, unsigned charWriteAddr);
unsigned char I2C1_Read(unsigned char ReadAddr);
void init(void)
{
Init_NVICSetup();
InitPortA();
InitPortB();
Init_UART0Config();
InitSysTick();
Init_BS8116A_3();
InitialGlobal();
}
void reset(void)
{
NVIC_SystemReset();
}
/**********************************
* ���GPIO
* *******************************/
static void InitPortA(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOA Periph clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
/* �����SART1��PIO TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* �����SART1��PIO RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Connect PA9 to USART1_TX */
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
/* Connect PA10 to USART1_RX */
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
}
static void InitPortB(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOB Periph clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
/*Configure GPIO pin for LCD Controller */
/*Configure GPIO pin for LCD Controller */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // JimmySCL SDA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
static void InitSysTick(void)
{
/* SysTick */
if (SysTick_Config(SystemCoreClock / 1000))
{
/* Capture error */
while (1);
}
}
static void Init_NVICSetup(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* NVIC configuration */
/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void beep(void)
{
/* if(~IS_CLOSE_BEEP) */
{
GPIOB->BSRR = GPIO_Pin_4;
buzzer_count = tmcount;
SET_BUZZER;
}
}
void stpbeep(void)
{
GPIOB->BRR = GPIO_Pin_4;
CLR_BUZZER;
}
static void Init_UART0Config(void)
{
/* Enable USART1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* USARTx configured as follow:
- BaudRate = 9600 baud
- Word Length = 8 Bits
- One Stop Bit
- None parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate =9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
/* Enable the USARTx Receive interrupt: this interrupt is generated when the
USARTx receive data register is not empty */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
/* Enable USART */
USART_Cmd(USART1, ENABLE);
init_uart();
}
void init_uart(void)
{
uart.rsflags = 0;
uart.rq0 = 0;
uart.rq1 = 0;
uart.tq0 = 0;
uart.tq1 = 0;
SET_SEDEND;
}
my_byte ochar(my_ubyte c)
{
my_byte tx;
tx=uart.tq1;
tx++;
if(tx==UART_BUF_LEN) tx=0;
if(tx!=uart.tq0)
{
uart.tbuffer=c;
uart.tq1=tx;
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
while(!IS_SEDEND);
CLR_SEDEND;
return 0;
}
else
return -1;
}
my_int16 ichar(void)
{
if(uart.rq0 != uart.rq1)
{
my_int16 h;
h = uart.rbuffer;
if(uart.rq0 == UART_BUF_LEN) uart.rq0 = 0;
return h;
}
else return -1;
}
static void Init_BS8116A_3(void)
{
I2C_InitTypeDef I2C_InitStructure;
/* Configure the I2C clock source. The clock is derived from the HSI */
RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
/*!< I2C Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); // 启用 I2C1 的 RCC 时钟
//*I2C configuration
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;// I2C 模式
I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
I2C_InitStructure.I2C_DigitalFilter = 0x00;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;// own address, not relevant in master mode
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;// 设定 I2C 地址长度为 7 bit
//I2C_InitStructure.I2C_Timing = 0x00901D2B;
I2C_InitStructure.I2C_Timing = 0x00201D2B/*0x1045061D*//*0x00210507*//*0xB0420F13*//*0xFFFFFFFF*/;
/* Apply I2C configuration after enabling it */
I2C_Init(I2C1, &I2C_InitStructure); // 初始化 I2C1
/* I2C Peripheral Enable */
I2C_Cmd(I2C1, ENABLE); // 启用 I2C1
/* BS8116A-3 write setting Register */
I2C_TransferHandling(I2C1, 0x50, 22, I2C_Reload_Mode,I2C_Generate_Start_Read);
(ochar('a'));
I2C_SendData(I2C1, 0xB0);
(ochar('g'));
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)==RESET );
(ochar('b'));
I2C_SendData(I2C1, 0x00); //Option1
(ochar('c'));
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE)==RESET );
(ochar('d'));
I2C_SendData(I2C1, 0x00); //Reserve
(ochar('e'));
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) ==RESET);
(ochar('f'));
I2C_SendData(I2C1, 0x83); //Reserve
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0xF3); //Reserve
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x98); //Option2
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K1_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K2_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K3_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K4_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K5_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K6_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K7_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K8_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K9_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K10_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K11_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K12_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K13_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K14_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K15_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0x08); //K16_TH
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
I2C_SendData(I2C1, 0xEE); //checksum(get low byte)
(ochar('z'));
}
void InitialGlobal(void)
{
GlobeOption=0;
GlobeOption=0;
GlobeOption=GlobeOptionA;
GlobeOption=GlobeOptionB;
GlobeOption=GlobeOptionC;
GlobeOption =Key1Threshold;
GlobeOption =Key2Threshold;
GlobeOption=Key3Threshold;
GlobeOption=Key4Threshold;
GlobeOption=Key5Threshold;
GlobeOption=Key6Threshold;
GlobeOption=Key7Threshold;
GlobeOption=Key8Threshold;
GlobeOption=Key9Threshold;
GlobeOption=Key10Threshold;
GlobeOption=Key11Threshold;
GlobeOption=Key12Threshold;
GlobeOption=Key13Threshold;
GlobeOption=Key14Threshold;
GlobeOption=Key15Threshold;
GlobeOption=Key16Threshold;
}
//*******************************************************************************
// : void I2C2_Write(unsigned char data, unsigned charWriteAddr)
//******************************************************************************
void I2C1_Write(unsigned char data, unsigned charWriteAddr)
{
I2C_TransferHandling(I2C1, 0x50, 1, I2C_Reload_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET);
I2C_SendData(I2C1, WriteAddr);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TCR) == RESET);
I2C_TransferHandling(I2C1, 0x50, 1, I2C_AutoEnd_Mode, I2C_No_StartStop);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET);
I2C_SendData(I2C1, data);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == RESET);
I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
}
//*******************************************************************************
// : unsigned char I2C1_Read(unsigned char ReadAddr)
//******************************************************************************
unsigned char I2C1_Read(unsigned char ReadAddr)
{
unsigned char temp;
ochar('D');
I2C_TransferHandling(I2C1, 0x50, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
ochar('E');
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == SET);
ochar('F');
I2C_SendData(I2C1, ReadAddr);
ochar('G');
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == SET);
ochar('H');
I2C_TransferHandling(I2C1, 0x50, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
ochar('I');
while(I2C_GetFlagStatus(I2C1, I2C_ISR_RXNE) == SET);
ochar('J');
temp = I2C_ReceiveData(I2C1);
ochar('K');
while(I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == SET);
ochar('L');
I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
ochar('M');
return temp;
ochar('N');
}
帮你消灭下0回复 linux跑windows,大家都是windows跑linux,:lol:lol 我也在用它 ,IO模拟方式....
调了一个周:L:L:L 我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951 wofei1314 发表于 2017-2-28 11:06
我也在用它 ,IO模拟方式....
调了一个周
我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951 wqiang123 发表于 2017-3-11 19:21
我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951 ...
谢谢啦 触摸触发门限值 一般选用多少啊;能把你调好的程序给我参考下么 wofei1314 发表于 2017-2-28 11:06
我也在用它 ,IO模拟方式....
调了一个周
我也用IO模拟的方式;我现在的问题就是,触摸分析出来的结果 成功率很低;经常误触发;请问在按键值分析方面有什么需要注意的么?我采用的方式是switch分析,每次只能有一个按键被触摸,多个按键触摸就会返回错误值 wqiang123 发表于 2017-3-11 19:21
我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951 ...
我的IIC倒是通了,设置寄存器值都没问题;但是触摸按键的返回值经常是错的,比如触摸的是KEY;有可能会返回key6被触摸的值
页:
[1]
2