各位大佬,小弟初入职场,刚开始使用单片机,公司要求用stm8003f做一块单板发出信号的从机,想确认一下,ST官网上下载的这个软件IIc从机的代码是否可以使用,有没有什么要注意的地方。 小弟下载后,烧录到单片机里面后,用另一块单板发送信号,不确定用另一块单板发送的主机信号是否正确,使用示波器看,也不会判断,所以想问一下,有没有使用过的大佬,给点建议,谢谢大佬,然后PB4,PB5这两个引脚是否要做什么特殊处理,因为在很多论坛的资料上,大家都说这两个引脚没有办法上啦,不知道作为从机的话,使用这两个引脚有没有什么要注意的地方,然后用这块单片机做从机的话,有没有办法给出什么反馈信息,可以方便我调试,谢谢各位大佬。 下面是,从官网上下载的程序的主要代码的部分 #include "I2c_slave_interrupt.h" #define MAX_BUFFER 32 u8 u8_My_Buffer[MAX_BUFFER]; u8 *u8_MyBuffp; u8 MessageBegin; // ********************** Data link function **************************** // * These functions must be modified according to your application neeeds * // * See AN document for more precision // ********************************************************************** |
{
MessageBegin = TRUE;
}
void I2C_transaction_end(void)
{
//Not used in this example
}
void I2C_byte_received(u8 u8_RxData)
{
if (MessageBegin == TRUE && u8_RxData < MAX_BUFFER) {
u8_MyBuffp= &u8_My_Buffer[u8_RxData];
MessageBegin = FALSE;
}
else if(u8_MyBuffp < &u8_My_Buffer[MAX_BUFFER])
*(u8_MyBuffp++) = u8_RxData;
}
u8 I2C_byte_write(void)
{
if (u8_MyBuffp < &u8_My_Buffer[MAX_BUFFER])
return *(u8_MyBuffp++);
else
return 0x00;
}
// ********************** Data link interrupt handler *******************
#ifdef _RAISONANCE_
void I2C_Slave_check_event(void) interrupt 19 {
#endif
#ifdef _COSMIC_
@far @interrupt void I2C_Slave_check_event(void) {
#endif
static u8 sr1;
static u8 sr2;
static u8 sr3;
// save the I2C registers configuration
sr1 = I2C->SR1;
sr2 = I2C->SR2;
sr3 = I2C->SR3;
/* Communication error? */
if (sr2 & (I2C_SR2_WUFH | I2C_SR2_OVR |I2C_SR2_ARLO |I2C_SR2_BERR))
{
I2C->CR2|= I2C_CR2_STOP; // stop communication - release the lines
I2C->SR2= 0; // clear all error flags
}
/* More bytes received ? */
if ((sr1 & (I2C_SR1_RXNE | I2C_SR1_BTF)) == (I2C_SR1_RXNE | I2C_SR1_BTF))
{
I2C_byte_received(I2C->DR);
}
/* Byte received ? */
if (sr1 & I2C_SR1_RXNE)
{
I2C_byte_received(I2C->DR);
}
/* NAK? (=end of slave transmit comm) */
if (sr2 & I2C_SR2_AF)
{
I2C->SR2 &= ~I2C_SR2_AF; // clear AF
I2C_transaction_end();
}
/* Stop bit from Master (= end of slave receive comm) */
if (sr1 & I2C_SR1_STOPF)
{
I2C->CR2 |= I2C_CR2_ACK; // CR2 write to clear STOPF
I2C_transaction_end();
}
/* Slave address matched (= Start Comm) */
if (sr1 & I2C_SR1_ADDR)
{
I2C_transaction_begin();
}
/* More bytes to transmit ? */
if ((sr1 & (I2C_SR1_TXE | I2C_SR1_BTF)) == (I2C_SR1_TXE | I2C_SR1_BTF))
{
I2C->DR = I2C_byte_write();
}
/* Byte to transmit ? */
if (sr1 & I2C_SR1_TXE)
{
I2C->DR = I2C_byte_write();
}
GPIOD->ODR^=1;
}
void Init_I2C (void)
{
#ifdef I2C_slave_7Bits_Address
/* Set I2C registers for 7Bits Address */
I2C->CR1 |= 0x01; // Enable I2C peripheral
I2C->CR2 = 0x04; // Enable I2C acknowledgement
I2C->FREQR = 16; // Set I2C Freq value (16MHz)
I2C->OARL = (SLAVE_ADDRESS << 1) ; // set slave address to 0x51 (put 0xA2 for the register dues to7bit address)
I2C->OARH = 0x40; // Set 7bit address mode
#endif
#ifdef I2C_slave_10Bits_Address
/* Set I2C registers for 10Bits Address */
I2C->CR1 |= 0x01; // Enable I2C peripheral
I2C->CR2 = 0x04; // Enable I2C acknowledgement
I2C->FREQR = 16; // Set I2C Freq value (16MHz)
I2C->OARL = (SLAVE_ADDRESS & 0xFF) ; // set slave address LSB
I2C->OARH = 0xC0 | ((SLAVE_ADDRESS & 0x300) >> 7); // Set 10bits address mode and address MSB
#endif
I2C->ITR = 0x07; // all I2C interrupt enable
}
#include "stm8s.h"
#include "I2c_slave_interrupt.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/* Public functions ----------------------------------------------------------*/
/*
* Example firmware main entry point.
* Parameters: None
* Retval . None
*/
void main(void)
{
CLK->CKDIVR = 0; // sys clock /1
/* Init GPIO for I2C use */
GPIOE->CR1 |= 0x06;
GPIOE->DDR &= ~0x06;
GPIOE->CR2 &= ~0x06;
/* Initialise I2C for communication */
Init_I2C();
/* Enable general interrupts */
enableInterrupts();
/*Main Loop */
while(1)
{
};
}
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
* Copyright (c) 2007 STMicroelectronics
*/
#include "I2c_slave_interrupt.h"
typedef void @far (*interrupt_handler_t)(void);
struct interrupt_vector {
unsigned char interrupt_instruction;
interrupt_handler_t interrupt_handler;
};
@far @interrupt void NonHandledInterrupt(void)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
}
extern void _stext(); /* startup routine */
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, NonHandledInterrupt}, /* trap */
{0x82, NonHandledInterrupt}, /* irq0 */
{0x82, NonHandledInterrupt}, /* irq1 */
{0x82, NonHandledInterrupt}, /* irq2 */
{0x82, NonHandledInterrupt}, /* irq3 */
{0x82, NonHandledInterrupt}, /* irq4 */
{0x82, NonHandledInterrupt}, /* irq5 */
{0x82, NonHandledInterrupt}, /* irq6 */
{0x82, NonHandledInterrupt}, /* irq7 */
{0x82, NonHandledInterrupt}, /* irq8 */
{0x82, NonHandledInterrupt}, /* irq9 */
{0x82, NonHandledInterrupt}, /* irq10 */
{0x82, NonHandledInterrupt}, /* irq11 */
{0x82, NonHandledInterrupt}, /* irq12 */
{0x82, NonHandledInterrupt}, /* irq13 */
{0x82, NonHandledInterrupt}, /* irq14 */
{0x82, NonHandledInterrupt}, /* irq15 */
{0x82, NonHandledInterrupt}, /* irq16 */
{0x82, NonHandledInterrupt}, /* irq17 */
{0x82, NonHandledInterrupt}, /* irq18 */
{0x82, (interrupt_handler_t) I2C_Slave_check_event}, /* irq19 */
{0x82, NonHandledInterrupt}, /* irq20 */
{0x82, NonHandledInterrupt}, /* irq21 */
{0x82, NonHandledInterrupt}, /* irq22 */
{0x82, NonHandledInterrupt}, /* irq23 */
{0x82, NonHandledInterrupt}, /* irq24 */
{0x82, NonHandledInterrupt}, /* irq25 */
{0x82, NonHandledInterrupt}, /* irq26 */
{0x82, NonHandledInterrupt}, /* irq27 */
{0x82, NonHandledInterrupt}, /* irq28 */
{0x82, NonHandledInterrupt}, /* irq29 */
};
评分
查看全部评分
没有用过逻辑分析仪,也没买那个东西,谢谢您告诉我这个方法,我想知道,您知道这个官网上面的案例代码是否真实可用呢?
我刚刚查了逻辑分析仪,应该来说逻辑分析仪看和用示波器看是一样的,我现在的问题在于,不知道我所用的主机发出来的iic信号是否符合stm8作为从机所需要的iic主机信号,如果说,这个代码我能够确定是一定能用的话,我就要往,主机发送数据方面想办法改进,就不用在从机这边再做很多功夫了,然后,通道数的话 ,我只需要一根通道的,所以,应该是不需要用逻辑分析仪吧?
刚才用示波器看见了完整的波形了,在第七位的时候 ,没有发出应答信号,我不知道为什么人家说有应答信号呢?
1、逻辑分析仪和示波器侧重点不一样。2、把完整波形发出来、3、先把I2C协议弄懂了再判断
评分
查看全部评分