iic从机
- 
					
					
					
					
 iic如何实现从机状态,能否提供参考代码 
 感谢
 
- 
					
					
					
					
 void iic_init(enum iic_channel_t channel, uint16_t speed, uint16_t slave_addr) 
 {
 volatile struct iic_reg_t *iic_reg;if(channel == IIC_CHANNEL_0) 
 {
 iic_reg = IIC0_REG_BASE;
 }
 else
 {
 iic_reg = IIC1_REG_BASE;
 }iic_reg->clkdiv.clk_div = (system_get_pclk_config()*1000/speed-10)/2; 
 iic_reg->control.soft_reset = 1;
 iic_reg->control.seven_bit = 1;
 iic_reg->address.slv_addr = slave_addr;iic_byte_period[channel] = 1000/speed + 1; 
 //enable interrupt
 iic_reg->control.rec_noemp_ie = 1;//接收fifo非空中断
 iic_reg->control.slv_noful_ie = 1;//从机发送fifo不满中断
 NVIC_EnableIRQ(IIC0_IRQn);
 }void iic0_isr(void) 
 {
 volatile struct iic_reg_t *iic_reg = IIC0_REG_BASE;
 uint8_t data;if(iic_reg->status.rec_emp == 0)//接收fifo非空 
 {
 iic_test_reg_addr = iic_reg->data;//从机接收数据
 co_printf("%d rec_data = %d \r\n",iic_master_data_rx_cnt++,iic_test_reg_addr);
 }
 else if(iic_reg->status.slv_trans_ful ==0){//从机发送fifo不满
 while(iic_reg->status.slv_trans_ful ==0){
 data = rand() & 0xFF;//从机发送随机数据
 iic_reg->slavedata.slave_data = data;//iic_slave_data_Tx_buffer[iic_slave_data_Tx_cnt++];
 co_printf("send %d.\r\n", data);
 }
 }
 }
 
- 
					
					
					
					
 NVIC_EnableIRQ(IIC0_IRQn); 
 调用后系统就崩溃了
 Crash, dump regs:
 PC = 0x00000000
 LR = 0xFFFFFFF9
 用的是ble_multi_role
 
- 
					
					
					
					
 发现,去掉 
 iic_reg->control.slv_noful_ie = 1;
 就不崩溃了
 ??????????????
 
- 
					
					
					
					
 还有个问题 
 发现I2C从机没有trans_done_ie中断
 加了iic_reg->control.trans_done_ie = 1;
 也没用的
 急
 
- 
					
					
					
					
 @whp “调用后系统就崩溃了 
 Crash, dump regs:”,检查一下中断向量表 
 
- 
					
					
					
					
 @whp “发现I2C从机没有trans_done_ie中断 
 加了iic_reg->control.trans_done_ie = 1;”
 从机没有trans_done_ie,建议从机发送的时候使能slv_noful_ie,通过slv_trans_ful检测slave fifo非满,实现中断发送
 
- 
					
					
					
					
 现在是从机接收有问题,无法识别哪个是地址,哪个是数据 
 
- 
					
					
					
					
 BUS_ACT状态变化好像和说明是不一样的 
 能否做检测地址?
 
- 
					
					
					
					
 这个需要主从约定,IIC接收无法区分地址和数据